为数值求解器提供更简单的面向对象计算。
npsolve的Python项目详细描述
npsolve公司
npsolve包是基于numpy和 fastwire,以便使用面向对象的类和方法 数值求解器的计算步骤。在
许多数值解算器(如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
属性。因此,我们将添加更多方法:
现在,我们将设置解算器。对于本例,我们将使用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)
- 项目
标签: