用scipy的solve_ivp 求解复数常微分方程组

因科研需要,我要求复数odes,首先想python scipy 能不能求,例如dx/dt=ix ,应该能求出振荡解。于是有了下面代码。

注意代码中只对y1进行了求解,初始条件一定要写成a+bj(或bj)的形式,告诉它你的初值是复数,即使虚部可能为零。如果只填个实数,后面求解会把dydt中取实部。然后算出来就是一条直线。

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

# 定义常微分方程组
def equations(t, y):
    [y1] = y
    dydt = [y1*1j]
    return dydt

# 设置初始条件
y0 = [1+0j]

# 设置时间范围
tmax=10
t_span = [0, tmax]
t2 = np.linspace(0,tmax,100)
# 求解常微分方程组
sol = solve_ivp(equations, t_span, y0,method='RK45',t_eval=t2)

# 绘制y-t图像
plt.plot(sol.t, np.real(sol.y[0]), label='y1')
plt.xlabel('t')
plt.ylabel('y')
plt.legend()
plt.show()

输出结果是y1的实部:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PythonSciPy求解一阶常微分方程的示例代码: ``` import numpy as np from scipy.integrate import solve_ivp import matplotlib.pyplot as plt # 定义微分方程组 def myODE(t, y): dydt = np.zeros((2,)) dydt[0] = y[1] dydt[1] = -np.sin(y[0]) return dydt # 设置初始条件 tspan = (0, 10) y0 = [1, 0] # 调用solve_ivp函数求解微分方程组 sol = solve_ivp(myODE, tspan, y0) # 绘制结果 plt.plot(sol.t, sol.y[0], '-o', label='y1') plt.plot(sol.t, sol.y[1], '-x', label='y2') plt.legend() plt.xlabel('t') plt.ylabel('y') plt.show() ``` 在上面的代码中,我们首先定义了一个名为myODE的函数来描述微分方程组。该函数接受两个参数t和y,其中t表示当前时间,y是一个包含微分方程组中每个变量的向量。函数返回一个包含每个变量的导数的向量dydt。在这个例子中,我们定义了一个简单的微分方程组,其中第一个变量y1的导数是y2,第二个变量y2的导数是-sin(y1)。 接下来,我们设置了初始条件tspan和y0。tspan是一个包含开始和结束时间的元,y0是一个包含每个变量初始值的列表。 然后,我们调用了SciPysolve_ivp函数来求解微分方程组。该函数接受三个参数:微分方程组函数的句柄,时间范围和初始条件。它返回一个名为sol的对象,该对象包含时间向量sol.t和包含每个变量的值的矩阵sol.y。 最后,我们使用matplotlib库的plot函数绘制了结果。我们绘制了y1和y2随时间的变化,并用legend函数添加了一个图例。最后使用show函数显示图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值