我是SciPy.org数学库的新手,所以对于熟悉它们的人来说,这可能是一个相当基本的问题。
对于这首颂歌:
y'(t) - 0.05y(t) = d, y(0) = 10
如果y(10) = 100,我如何计算'd‘的值?
我可以这样求解y(t):
import sympy as sym
y = sym.Function('y')
t, d = sym.symbols('t d')
y1 = sym.Derivative(y(t), t)
eqdiff = y1 - 0.05*y(t) - d
sol = sym.dsolve(eqdiff, y(t), ics={y(0): '10'})
sol
y(t)= −20.0d + (20.0d + 10.0)e^(0.05t)
当y(10) =100时,"sol“是否可用于求解d对我来说是未知的(对于这个问题,SymPy可能不是首选的库)。
我已经看了很多这样的网页,但还没有找到前进的方向:
https://docs.sympy.org/latest/modules/solvers/ode.html
Converting sympy expression to numpy expression before solving with fsolve( )
https://apmonitor.com/pdc/index.php/Main/SolveDifferentialEquations
我知道有一些图形化的方法来解决这个问题,但我想要一个数字结果。
提前感谢您的有益建议。
发布于 2021-10-03 00:57:38
您可以替换这些值并使用solve
In [5]: sol.subs(t, 10)
Out[5]: y(10) = 12.9744254140026⋅d + 16.4872127070013
In [6]: sol.subs(t, 10).subs(y(10), 100)
Out[6]: 100 = 12.9744254140026⋅d + 16.4872127070013
In [7]: solve(sol.subs(t, 10).subs(y(10), 100), d)
Out[7]: [6.43672337141557]
https://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.solve
发布于 2021-10-03 04:34:46
你也可以用scipy解决这个问题。整个任务是一个带有一个自由参数的边值问题,一个状态维数加上一个自由参数等于两个边界槽。因此使用solve_bvp
(即使这是一个标量问题,求解器也会将每个状态空间视为向量空间)
def eqn(t,y,d): return d+0.05*y
def bc(y0,y10,d): return [ y0[0]-10, y10[0]-100 ]
x_init = [0,10]
y_init = [[10, 100]]
d_init = 1
res = solve_bvp(eqn, bc, x_init, y_init, p=[d_init], tol=1e-5)
print(res.message, f"d={res.p[0]:.10f}")
这给了我们
The algorithm converged to the desired accuracy. d=6.4367242595
https://stackoverflow.com/questions/69422213
复制