【问题标题】:Can you give a simple example of adaptive stepsize scipy.integrate.LSODA function?你能举一个自适应步长 scipy.integrate.LSODA 函数的简单例子吗?
【发布时间】:2019-11-17 18:35:21
【问题描述】:

我需要了解 scipy.integrate.LSODA 函数的机制。

我编写了一个集成了一个简单功能的测试脚本。根据LSODA webpage函数的输入可以是rhs函数、t_min、初始y和t_max。另一方面,当我运行代码时,我什么也得不到。我该怎么办?

import scipy.integrate as integ
import numpy as np

def func(t,y):
    return t

y0=np.array([1])
t_min=1
t_max=10
N_max=100
t_min2=np.linspace(t_min,t_max,N_max)
first_step=0.01

solution=integ.LSODA(func,t_min,y0,t_max)
solution2=integ.odeint(func,y0,t_min2)

print(solution.t,solution.y,solution.nfev,'\n')
print(solution2)

解决方案

1 [ 1.] 0

[[  1.00000000e+00]
 [  9.48773662e+00]
 [  9.00171421e+01]
 [  8.54058901e+02]
 [  8.10308559e+03]]

【问题讨论】:

    标签: python-3.x differential-equations numerical-integration odeint


    【解决方案1】:

    1.) 您只需启动 LSODA 求解器类的实例,不会发生计算,只需使用初始数据初始化数组。要获得类似odeint 的界面,请使用solve_ivp 和选项method='LSODA'

    2.) 如果没有选项 tfirst=True,LSODA 求解器将求解 y'(t)=t,而 odeint 将求解 y'(t)=y(t)

    要获得可比较的结果,还应该平衡公差,因为默认公差可以不同。因此可以调用像

    这样的方法
    print "LSODA"
    solution=integ.solve_ivp(func,[t_min, t_max],y0,method='LSODA', atol=1e-4, rtol=1e-6)
    print "odeint"
    solution2=integ.odeint(func,y0,t_min2, tfirst=True, atol=1e-4, rtol=1e-6)
    

    即使那样你也没有得到关于odeint 的内部步骤的信息,即使 FORTRAN 代码有一个选项,python 包装器也不会复制它。您可以向 ODE 函数 func 添加一条打印语句,以便查看实际调用该函数的位置,这应该平均为每个内部步骤 2 次带有近距离参数的调用。

    这个报告

    LSODA
    1.0 [1.]
    1.00995134265 [1.00995134]
    1.00995134265 [1.01005037]
    1.01990268529 [1.02010074]
    1.01990268529 [1.02019977]
    10.0 [50.50009903]
    10.0 [50.50009903]
    odeint
    1.0 [1.]
    1.00109084546 [1.00109085]
    1.00109084546 [1.00109204]
    1.00218169092 [1.00218407]
    1.00218169092 [1.00218526]
    11.9106363102 [71.43162985]
    

    LSODA 的输出中报告的步骤在哪里

    [ 1.          1.00995134  1.01990269 10.        ] [[ 1.          1.01005037  1.02019977 50.50009903]] 7
    

    当然,高阶方法会将线性多项式y'=t 与二次多项式y(t)=0.5*(t^2+1) 积分,基本上没有与步长无关的误差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多