gpt4 book ai didi

python - 在 Python 中求解数值 ODE

转载 作者:太空狗 更新时间:2023-10-29 17:37:31 28 4
gpt4 key购买 nike

如何在 Python 中对 ODE 进行数值求解?

考虑

equation to solve

\ddot{u}(\phi) = -u + \sqrt{u}

满足以下条件

u(0) = 1.49907

\dot{u}(0) = 0

有限制

0 <= \phi <= 7\pi.

最后,我想生成一个参数图,其中 x 和 y 坐标是作为 u 的函数生成的。

问题是,我需要运行 odeint 两次,因为这是一个二阶微分方程。我试着让它在第一次运行后再次运行,但它返回时出现雅可比错误。必须有一种方法可以同时运行它两次。

这里是错误:

odepack.error: The function and its Jacobian must be callable functions

下面的代码生成的。有问题的行是 sol = odeint。

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from numpy import linspace


def f(u, t):
return -u + np.sqrt(u)


times = linspace(0.0001, 7 * np.pi, 1000)
y0 = 1.49907
yprime0 = 0
yvals = odeint(f, yprime0, times)

sol = odeint(yvals, y0, times)

x = 1 / sol * np.cos(times)
y = 1 / sol * np.sin(times)

plot(x,y)

plt.show()

编辑

我正在尝试构建第 9 页上的情节

Classical Mechanics Taylor

这是 Mathematica 的情节

mathematica plot

In[27]:= sol = 
NDSolve[{y''[t] == -y[t] + Sqrt[y[t]], y[0] == 1/.66707928,
y'[0] == 0}, y, {t, 0, 10*\[Pi]}];

In[28]:= ysol = y[t] /. sol[[1]];

In[30]:= ParametricPlot[{1/ysol*Cos[t], 1/ysol*Sin[t]}, {t, 0,
7 \[Pi]}, PlotRange -> {{-2, 2}, {-2.5, 2.5}}]

最佳答案

import scipy.integrate as integrate
import matplotlib.pyplot as plt
import numpy as np

pi = np.pi
sqrt = np.sqrt
cos = np.cos
sin = np.sin

def deriv_z(z, phi):
u, udot = z
return [udot, -u + sqrt(u)]

phi = np.linspace(0, 7.0*pi, 2000)
zinit = [1.49907, 0]
z = integrate.odeint(deriv_z, zinit, phi)
u, udot = z.T
# plt.plot(phi, u)
fig, ax = plt.subplots()
ax.plot(1/u*cos(phi), 1/u*sin(phi))
ax.set_aspect('equal')
plt.grid(True)
plt.show()

enter image description here

关于python - 在 Python 中求解数值 ODE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928750/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com