为数值求解器提供更简单的面向对象计算。

npsolve的Python项目详细描述


npsolve公司

npsolve包是基于numpyfastwire,以便使用面向对象的类和方法 数值求解器的计算步骤。在

许多数值解算器(如scipy中的那些)提供了如下候选解: 一个无聊的日子。它们通常还需要一个numpy ndarray作为返回值 (例如一系列导数)在解的过程中。这些要求可以 很难使用面向对象的方法来执行计算。 通常,我们最终得到的是类似脚本的代码,它失去了许多好处 面向对象编程。在

npsolve框架将一个解算器与多个处理 算法中每个步骤的计算。它允许不同的部分 对计算进行封装和多态,并生成代码 更容易修改和维护。在

基本用法教程

让我们使用npsolve进行一些时间上的集成,就像您所做的那样 解一首颂歌。不过,我们使用的不是方程,而是类方法。这个 所有教程的代码都可以在存储库的“示例”下找到。在

首先,设置一些要进行计算的类。我们这样做 通过使用add_var方法设置变量及其初始值。在

importnumpyasnpimportnpsolveclassComponent1(npsolve.Partial):def__init__(self):super().__init__()# Don't forget to call this!self.add_var('position',init=0.1)self.add_var('velocity',init=0.3)classComponent2(npsolve.Partial):def__init__(self):super().__init__()# Don't forget to call this!self.add_var('force',init=-0.1)

所有变量将自动提供给所有部分实例 通过它们的state属性。这是一本字典。add_var方法 将初始值设置到实例的状态字典中。稍后,Solver 最终将用一个新字典替换state属性 包含所有分部类中的所有变量。在

接下来,我们将告诉这些类如何在每一个时间内进行一些计算 步骤。step方法被自动调用,它需要一个字典 返回值(如导数)。我们就用这个。国家 字典再次作为第一个参数给出,但我们将使用 改为使用内部state属性。因此,我们将添加更多方法:

^{pr2}$

现在,我们将设置解算器。对于本例,我们将使用odeint解算器 来自西皮。下面是它的样子:

fromscipy.integrateimportodeintclassSolver(npsolve.Solver):defsolve(self):self.npsolve_init()# Initialiseself.t_vec=np.linspace(0,10,1001)result=odeint(self.step,self.npsolve_initial_values,self.t_vec)returnresult

让我们看看solve方法中发生了什么。默认情况下,解算器 有一个可以使用的step方法。(它们还有一个one_way_step 方法,该方法不需要从分部返回值,以及tstep 方法,它需要将时间值作为第一个参数。)初始化后, 部分类设置的初始值在 npsolve_initial_values属性。默认情况下,解算器的step方法 返回所有返回值的向量,大小与解算器的大小相同 npsolve_initial_values数组。所以大部分的工作都是为我们做的 已经。在

请注意,我们不需要知道任何关于模型或 模型中的元素。这使我们能够将模型和部分分离 从解算器。我们可以传递不同的模型,也可以传递给不同的模型 解决方案。我们可以用不同的组件制作模型。它既灵活又简单 维持!在

要运行,我们只需实例化解算器和部分实例, 然后将部分实例的列表或字典传递给connect 求解器的方法。它们将通过fastwire自动连接。在

defrun():solver=Solver()partials=[Component1(),Component2()]solver.connect(partials)res=solver.solve()returnres,solver

我们来画个图看看结果。使用的npsolve_slices属性 求解器来获得正确的列。在

importmatplotlib.pyplotaspltdefplot(res,s):slices=s.npsolve_slicesplt.plot(s.t_vec,res[:,slices['position']],label='position')plt.plot(s.t_vec,res[:,slices['velocity']],label='velocity')plt.plot(s.t_vec,res[:,slices['force']],label='force')plt.legend()

运行它看看会发生什么!在

res,s=run()plot(res,s)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么程序显示空结果?   java应用程序在测试设备上调试时工作正常,但在发布版apk中没有,它没有获得post。来自firebase的类变量   java Android:从主活动按钮确定在listview中选中哪个复选框   在Spring中添加@OneToOne注释时启动ApplicationContext时发生java错误   用JAVA Android实现矩阵计算的最快方法   SpringJava语义有没有更好的编写方法?   java从hashmap中减去两个值后返回最小差值的键?   Java中的静态初始化顺序:Netty 4.0.7的例外   java如何检查用户输入是否为字符串   循环Java计数单词索引   java如何使用以下代码将视频流传输到Android异步Http服务器?   java如何在jtable的所有行中循环   java如何使用maven将unicode插入mysql   java使用安卓加速远程数据检索   java试图模拟麦克风(javax.sound.sampled)   swing SwingWorker从不归还任何东西?(爪哇)   首次在Android Studio上未加载java LibGDX文件   java如何在多个Mysql服务器上设置限制和偏移?   如何防止从java连接到mongodb时登录控制台?