GVKun编程网logo

如何在 Python 中为地球、月球和小行星(仅动画部分)的计算机模拟制作 Matplotlib 动画?

12

本文将带您了解关于如何在Python中为地球、月球和小行星的新内容,同时我们还将为您解释仅动画部分的计算机模拟制作Matplotlib动画?的相关知识,另外,我们还将为您提供关于4.1Python数据

本文将带您了解关于如何在 Python 中为地球、月球和小行星的新内容,同时我们还将为您解释仅动画部分的计算机模拟制作 Matplotlib 动画?的相关知识,另外,我们还将为您提供关于4.1Python数据处理篇之Matplotlib系列(一)---初识Matplotlib、Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)、java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本、Python / matplotlib:摆脱matplotlib.mpl警告的实用信息。

本文目录一览:

如何在 Python 中为地球、月球和小行星(仅动画部分)的计算机模拟制作 Matplotlib 动画?

如何在 Python 中为地球、月球和小行星(仅动画部分)的计算机模拟制作 Matplotlib 动画?

如何解决如何在 Python 中为地球、月球和小行星(仅动画部分)的计算机模拟制作 Matplotlib 动画??

我正在尝试对地球、月球和小行星绕太阳运行进行计算机模拟。

数据 r_earth、r_moon 和 r_asteroid 已经给出(它们是一个数组)。 xlim 和 ylim 太大了,因为我必须使用来自宇宙的真实值,否则我在动画上看不到任何东西。

import numpy as np

def RK4_step(y,t,f,dt):         #for numerical part I decided to use RK4 method
    k1 = dt * f(y,t)
    k2 = dt * f(y + 0.5 * k1,t + 0.5 * dt)
    k3 = dt * f(y + 0.5 * k2,t + 0.5 * dt)
    k4 = dt * f(y + k3,t + dt)

    return (t + dt,y + (k1 + 2. * (k2 + k3) + k4) / 6.)


def integrate_ode(y0,derivative_fn,step_fn,a,b,n):
    dt = (b - a) / (n - 1)
    t = a
    y = np.array(y0)

    res = [y]
    for _ in range(1,n):
        t,y = step_fn(y,dt)
        res.append(y)
    return (np.linspace(a,n),np.array(res))

# np.array(res) is 2D array of dimensions (<time steps>,<um variables>) that holds the values for each time step.

# Initial parameters for body masses(Sun,Earth,Moon,Asteroid)
G = 6.674e-11
m_s = 1.989e30
m_e = 5.972e24
m_m = 7.346e22
m_a = 1e25


def derivative_fn(y,t):                 # vectors necessary for 2.Newton''s Law
    d1 = y[1] - y[0]
    vec01 = d1 / np.linalg.norm(d1) ** 3
    d2 = y[2] - y[0]
    vec02 = d2 / np.linalg.norm(d2) ** 3
    d3 = y[2] - y[1]
    vec12 = d3 / np.linalg.norm(d3) ** 3

    der = np.array([
        y[3],y[4],y[5],- G * m_s * y[0] / np.linalg.norm(y[0]) ** 3 + G * m_m * vec01 + G * m_a * vec02,- G * m_s * y[1] / np.linalg.norm(y[1]) ** 3 - G * m_e * vec01 + G * m_a * vec12,- G * m_s * y[2] / np.linalg.norm(y[2]) ** 3 - G * m_e * vec02 - G * m_m * vec12])

    return der

# numerically computed data in the array form
# y = [r_e,r_m,r_a,v_e,v_m,v_a] -> 2D array of size (6,2)

# the initial distances between the bodies,# for Earth and Moon we compute it from 2nd Newton''s Law (orbital veLocity)
r_e0 = 1.519e11
v_e0 = np.sqrt(G * m_s / r_e0)
r_m0 = 1.521e11
v_m0 = np.sqrt(G * m_e / abs(r_m0 - r_e0))
r_a0 = 1e11
v_a0 = 31293  # m/s
y0 = np.array([[r_e0,0.],[r_m0,[r_a0,[0.,v_e0],v_e0 + v_m0],v_e0 + v_a0]])
# all the parameters are Now in the array y0,# the last two are veLocities relative to the Earth

n = 10000
ts,ys = integrate_ode(y0,RK4_step,0.,5.154e7,n)

r_earth = ys[:,:]
r_moon = ys[:,1,:]
r_asteroid = ys[:,2,:]

# Plotting

import matplotlib.pyplot as plt

plt.xlabel("x")
plt.ylabel("y")

plt.plot(r_earth[:,0],r_earth[:,1],label="Earth")
plt.plot(r_moon[:,r_moon[:,label="Moon")
plt.plot(r_asteroid[:,r_asteroid[:,label="Asteroid")

plt.show()

from matplotlib.animation import FuncAnimation

fig,ax = plt.subplots()
ax.set_xlim([-0.3e12,0.3e12])
ax.set_ylim([-0.3e12,0.3e12])

# xlim and ylim are so big because we wouldn''t see the animation.

sun,= ax.plot(0.,''oy'',ms=20)
earth,= ax.plot(r_earth[0,r_earth[0,''og'',ms=10)
moon,= ax.plot(r_moon[0,r_moon[0,''ob'',ms=3)
asteroid,= ax.plot(r_asteroid[0,r_asteroid[0,''ok'',ms=1)

num_frames = 10000
frame_duration = n / num_frames


def animation_frame(frame):
    index = int(frame_duration * frame)
    earth.set_data(r_earth[index,r_earth[index,1])
    moon.set_data(r_moon[index,0] / r_earth[index,r_moon[index,1] / r_earth[index,1])
    asteroid.set_data(r_asteroid[index,r_asteroid[index,1])

    return earth,moon,asteroid


animation = FuncAnimation(fig,func=animation_frame,frames=range(num_frames),interval=50)

plt.show()

当我开始编写代码时,月亮与太阳的位置相同,两者都是静态的。地球绕太阳运动的速度非常缓慢,动画中没有小行星。

如何解决这个问题? 我仍然想使用真实数据,但希望动画速度快 100 倍(但动画仍然流畅)。我该怎么做?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

4.1Python数据处理篇之Matplotlib系列(一)---初识Matplotlib

4.1Python数据处理篇之Matplotlib系列(一)---初识Matplotlib

目录

[TOC]

前言

对于数据可视化的python库,对于Matplotlib早有耳闻,今天就来正式学习一下。

(一)matplotlib的介绍

matplotlib是python优秀的2D绘图库,可以完成大部分的绘图需求,同时其可定制性也很强,可内嵌在tkinter等各种GUI框架里。

官方网站:https://matplotlib.org/users/index.html

官方教程:https://matplotlib.org/tutorials/index.html

官方例子:https://matplotlib.org/gallery/index.html

(二)画一个简单的画布

==1.源代码==

import matplotlib.pyplot as plt
import numpy as np

# 在-1~1之间建立50个点
x = np.linspace(-1, 1, 50)
# y = 2*x + 1
y = x**2

# 创建画布
plt.plot(x, y)

# 展现画布
plt.show()

==2.展示效果==

01.png

(三)画布按键的功能介绍

==1.对于画布功能键的排序==

02.png

==(1)主页==

不管图片被你整成什么样,只要你按一下主页按钮,就会恢复到刚开始的样子。

==(2)上一个视图==

就是你改变了图片的位置,这个键就是跳到上一个键的图片位置。

==(3)下一个视图==

就是你改变了图片的位置,这个键就是跳到下一个键的图片位置。

==(4)移动查看==

我们可以以拖动的方式,来查看未显示的部分。

==(5)放大查看==

我们还可以用放大的方式,来细致的观察微小的部分。

==(6)窗体设置==

我们可以调整显示区域在窗体的显示位置。

03.png

==(7)保存图片==

我们可以把视图保存为图片。

04.png

作者:Mark

日期:2019/01/30 周三

Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)

Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)

To my knowledge so far, Cpp画图是真滴捉急, 那就调用python帮帮忙吧。

百度了好久,试了好几次,终于走完了配置的过程。我要记录一下。

 

1.0 配置:(操作系统)64位Win7, (Cpp的IDE是)Clion。

 

1.1 安装Clion

  官网下载就可以了,地址 https://www.jetbrains.com/clion/

 

1.2 安装,配置mingW64

  1.2.1:Clion需要我们安装Toolchain,我用的是mingW64(因为我用的是64位系统),附上百度网盘地址。

    地址:https://pan.baidu.com/s/14FkN0Ul9cvcRxCOcylmoxw,密码:qu5l

  1.2.2:然后我一股脑把路径全部添加到环境变量path了

    (

      D:\ProgramFile\mingw64;

      D:\ProgramFile\mingw64\bin;

      D:\ProgramFile\mingw64\lib;

      D:\ProgramFile\mingw64\include

    )  

  1.2.3:让Clion找到mingw64

  

    如果其中的Make, C Complier,C++ Complier没找到,就手动帮Clion添加。

    !!!注意mingw的版本(指的是64位还是32位),一定要和pyhton的匹配。否则会出现如下错误:

      载入Python.h:没问题 ; 读取其中函数:unreferenced...

1.3 安装python

  1.3.1 安装python3.7

    我的安装目录是 D:\ProgramFile\Python37 ,没有用Anaconda,事实上(可能是由于环境变量path中争抢调用关系的问题),我把原来装好的anaconda卸载了。

    安装的版本是官网下载的。

    同时,添加了 D:\ProgramFile\Python37到环境变量path。

  1.3.2 用pip安装matplotlib

    a. python3.7中的pip是自带的

    b. 将python安装目录下的scripts添加到环境变量bin

    c. (可选)查看python是否安装成功:在cmd界面,输入:python --version

    d. (可选)查看pip是否安装成功:在cmd界面,输入:pip --version

    e. (可选)升级pip:在cmd界面,输入:python -m pip install -U pip setuptools

    f.  用pip安装matplotlib:在cmd界面,输入:python -m pip install matplotlib

 

1.4 Clion联结Cpp和python

  1.4.1:CMakeLists.txt的配置:

    用clion新建cpp的project,在CMakeLists.txt中添加以下两句话

    # 添加python.h头文件路径
    
include_directories(D:/ProgramFile/Python37/include)
    # 添加python动态链接库文件
    link_libraries(D:/ProgramFile/Python37/libs/python37.lib)

    如下图:

  1.4.2:main.cpp的配置

    我直接上图吧,如果这个cpp可以运行,那么说明配置成功了。

    

  

 

java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本

java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本

写在前面,最近需要在java中调用matplotlib,其他一些画图包都没这个好,毕竟python在科学计算有优势。找到了matplotlib4j,大概看了下github上的https://github.com/sh0nk/matplotlib4j,maven repository:

<dependency>
   <groupId>com.github.sh0nk</groupId>
       <artifactId>matplotlib4j</artifactId>
       <version>0.5.0</version>
</dependency>

简单贴个测试类,更多的用法在test报下有个MainTest.class。

 @Test
    public void testPlot() throws IOException, PythonExecutionException, ClassNotFoundException, NoSuchMethodException, illegalaccessexception, InvocationTargetException, InstantiationException {
        Plot plot = Plot.create(PythonConfig.pythonBinPathConfig("D:\\python3.6\\python.exe"));
        plt.plot()
                .add(Arrays.asList(1.3, 2))
                .label("label")
                .linestyle("--");
        plt.xlabel("xlabel");
        plt.ylabel("ylabel");
        plt.text(0.5, 0.2, "text");
        plt.title("Title!");
        plt.legend();
        plt.show();

    }

下面问题来了,这个对matplotlib的封装不是很全面,源码里也有很多todo,有很多函数简单用用还行,很多重载用不了,比如plt.plot(xdata,ydata)可以,但是无法在其中指定字体plt.plot(xdata,ydata,fontsize=30);

所以想要更全面的用法还得自己动手,几种办法:

  1. 大部分还是用matplotlib4j中的,个别的自己需要的但里头没有的函数,实现他的builder接口,重写build方法,返回一个py文件中命令行的字符串形式,然后反射取到PlotImpl中的成员变量registeredBuilders,往后追加命令行,感觉适用于只有极个别命令找不到的情况,挺麻烦的,而且要是传nd.array(…)这种参数还得额外拼字符串。
//拿到plotImpl中用于组装python脚本语句的的registeredBuilders,需要加什么直接添加新的builder就行了
        Field registeredBuildersField = plt.getClass().getDeclaredField("registeredBuilders");
        registeredBuildersField.setAccessible(true);
        List<Builder> registeredBuilders = (List<Builder>) registeredBuildersField.get(plt);

        TicksBuilder ticksBuilder = new TicksBuilder(yList, "yticks", fontSize);
        registeredBuilders.add(ticksBuilder);
  1. 这种比较直接,参照matplotlib4j底层,直接写py.exe文件,执行命令行,比较推荐这种,一行一行脚本自己写,数据拼装方便,看起来直观。比如写如下的脚本并执行,搞两组数据,画个散点图
import numpy as np
import matplotlib.pyplot as plt
plt.plot(np.array(自己的x数据), np.array(自己的y数据), 'k.', markersize=4)
plt.xlim(0,6000)
plt.ylim(0,24)
plt.yticks(np.arange(0, 25, 1), fontsize=10)
plt.title("waterfall")
plt.show()

像下面这么写就行了

		//1. 准备自己的数据 不用管
        List<Float> y_secondList_formatByHours = y_secondList.stream().map(second -> (float)second / 3600).collect(Collectors.toList());

        //2.准备命令行list,逐行命令添加
        List<String> scriptLines = new ArrayList<>();
        scriptLines.add("import numpy as np");
        scriptLines.add("import matplotlib.pyplot as plt");
        scriptLines.add("plt.plot("+"np.array("+x_positionList+"),"+"np.array(" +y_secondList_formatByHours+"),\"k.\",label=\"waterfall\",lw=1.0,markersize=4)");
        scriptLines.add("plt.xlim(0,6000)");
        scriptLines.add("plt.ylim(0,24)");
        scriptLines.add("plt.yticks(np.arange(0, 25, 1), fontsize=10)");
        scriptLines.add("plt.title(\"waterfall\")");
        scriptLines.add("plt.show()");
        //3. 调用matplotlib4j 里面的pycommond对象,传入自己电脑的python路径
        pycommand command = new pycommand(PythonConfig.pythonBinPathConfig("D:\\python3.6\\python.exe"));
        //4. 执行,每次执行会生成临时文件 如C:\Users\ADMINI~1\AppData\Local\Temp\1623292234356-0\exec.py,这个带的日志输出能看到,搞定
        command.execute(Joiner.on('\n').join(scriptLines));

在这里插入图片描述

搞定。

Python / matplotlib:摆脱matplotlib.mpl警告

Python / matplotlib:摆脱matplotlib.mpl警告

我正在使用python 3.4使用matplotlib。启动程序时,出现以下警告消息:

C:\ Python34-32bits \ lib \ site-packages \ matplotlib \
cbook.py:123:MatplotlibDeprecationWarning:matplotlib.mpl模块在版本1.3中已弃用。使用import matplotlib as mpl代替。warnings.warn(消息,mplDeprecation,stacklevel = 1)

据我所知,我不使用mpl,并且所有关于matplotlib的导入都是:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

我该怎么办?

今天关于如何在 Python 中为地球、月球和小行星仅动画部分的计算机模拟制作 Matplotlib 动画?的介绍到此结束,谢谢您的阅读,有关4.1Python数据处理篇之Matplotlib系列(一)---初识Matplotlib、Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)、java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本、Python / matplotlib:摆脱matplotlib.mpl警告等更多相关知识的信息可以在本站进行查询。

本文标签: