matplotlib.animation 万有引力

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from scipy import constants as const
'''
万有引力公式
F = G*m1*m2/r^2
两球质量固定,r可以用横纵坐标计算
两球移动的加速度a = F/m
移动速度等于 v = v + at
分解为x轴,y轴速度
'''

fig,ax = plt.subplots()
dot1, = ax.plot([], [], 'ro')
dot2, = ax.plot([], [], 'bo')
m1 = 10
m2 = 20
G = const.G
print(G)
#两小球最初的位置
x_data = [5,60]
y_data = [5,50]
v1_x = v1_y = 0
v2_x = v2_y = 0
def init():
    # 设置横纵轴范围
    ax.set_xlim(0, 100)
    ax.set_ylim(0, 60)
    # 移位置 设为原点相交
    ax.xaxis.set_ticks_position('bottom')  # 设置为底部
    ax.spines['bottom'].set_position(('data', 0))  # 获取底部轴设置其位置,表示设置底部轴移动到竖轴的0坐标位置
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    return ax  # 画轨迹的话,将它改为l

def get_location():
    global v1_x,v1_y,v2_x,v2_y
    #每秒更新一次所以t为1
    while(x_data[0] <= x_data[1]): #没重合的时候
        r = ((x_data[1] - x_data[0]) ** 2 + (y_data[1] - y_data[0]) ** 2) ** 0.5
        F = G * m1 * m2 / r / r

        a1 = F / m1
        a2 = F / m2
        #计算加速度在x,y轴上的分解
        a1_x = a1 * (x_data[1] - x_data[0])/r
        a1_y = a1 * (y_data[1] - y_data[0])/r
        a2_x = a2 * (x_data[1] - x_data[0])/r
        a2_y = a2 * (y_data[1] - y_data[0])/r
        #计算新的位置
        v1_x += a1_x
        v1_y += a1_y
        v2_x += a2_x
        v2_y += a2_y
        x_data[0] = x_data[0] + v1_x
        x_data[1] = x_data[1] - v2_x
        y_data[0] = y_data[0] + v1_y
        y_data[1] = y_data[1] - v2_y
        newDate = [x_data,y_data]
        print(newDate)
        yield newDate

def update(frame):
    dot1.set_data(frame[0][0],frame[1][0])
    dot2.set_data(frame[0][1],frame[1][1])
    return dot1,dot2

ani = FuncAnimation(fig, update, frames=get_location, interval=1000, init_func=init)
ani.save('gravitation_dot.gif', writer='pillow', fps=30)

 可以看到横纵坐标几乎是不变的,尝试把质量增大,也几乎是不变的

matplotlib.animation 万有引力_第1张图片

好像没什么卵用,直接给引力常量成个10的11次方加大点看着玩吧

matplotlib.animation 万有引力_第2张图片

可以发现质量小的球,也就是红球,移动了更远的距离。

 

你可能感兴趣的:(可视化,python)