python - 如何使用solve_ivp用谱法求解偏微分方程?
问题描述
我想用谱法求解偏微分方程。像这样的方程,公式,初始条件是 u(t=0,x)=(a^2)*sech(x),u'_t (t=0)=0。
为了解决这个问题,我使用带有光谱方法的python。以下是代码,
import numpy as np
from scipy.integrate import solve_ivp
from scipy.fftpack import diff as psdiff
#RHS of equations
def f(t,u):
uxx= psdiff(u[N:],period=L,order=2)
du1dt=u[:N]
du2dt =a**2*uxx
dudt=np.append(du1dt,du2dt)
return dudt
a=1
amin=-40;bmax=40
L=bmax-amin;N=256
deltax=L/N
x=np.arange(amin,bmax,deltax)
u01 = 2*np.cosh(x)**(-1)
u02=np.zeros(N)
# y0
inital=np.append(u01,u02)
sola1 = solve_ivp(f, t_span=[0,40],y0=inital,args=(a,))
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(x,sola1.y[:N,5])
plt.show()
以下是我的预期结果,
预期结果。
我的python代码可以运行,但我无法得到预期的结果,也找不到问题。以下是我的python代码的结果, 我的结果
- - - - - - - - - - - - - - -更新 - - - - - - - - - - -------------------------- 我也尝试了新代码,但仍然无法解决
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
from scipy.fftpack import diff as psdiff
from itertools import chain
def lambdifide_odes(y,t,a):
# uxx =- (1j)**2*k**2*u[:N]
u1=y[::2]
u2=y[1::2]
dudt=np.empty_like(y)
du1dt=dudt[::2]
du2dt=dudt[1::2]
du1dt=u2
uxx=psdiff(u1,order=2,period=L)
du2dt=a**2*uxx
return dudt
a=1
amin=-40;bmax=40
L=bmax-amin;N=256
deltax=L/N
x=np.arange(amin,bmax,deltax)
u01 = 2*np.cosh(x)**(-1)
u02=np.zeros(N)
initial=np.array(list(chain.from_iterable(zip(u01,u02))))
t0=np.linspace(0,40,100)
sola1 = odeint(lambdifide_odes,y0=initial,t=t0,args=(a,))
fig, ax = plt.subplots()
ax.plot(x,sola1[20,::2])
plt.show()
解决方案
您的状态向量的设计和在 ODE 函数中使用它有一些小问题。总体意图是u[:N]
波函数u[N:]
及其时间导数。现在你想要波函数的二阶空间导数,因此你需要使用
uxx= psdiff(u[:N],period=L,order=2)
在您使用时间导数的那一刻,使其成为方程中未出现的混合三次导数。
推荐阅读
- javascript - React.js 和 Firebase 身份验证:setTimeout 回调函数未执行?
- javascript - 我如何使用不和谐的用户 ID 打击某人,而不必标记他们?
- python - 如何使用 discord.PartialEmoji/discord.Emoji 对象?
- javascript - 在 javascript 中将 API 响应数据格式化为所需的格式
- javascript - × ReferenceError: Home 未定义
- python - 在 selenium 中关闭选项卡正在使 current_window_handle = NoneType,即使有另一个选项卡打开
- java - Android studio生成APK获取错误任务':app:transformClassesWithDexBuilderForDebug'的执行失败
- python - FCN 只正确分类了一类
- python - 给定特定元素时,列表列表会更新整个列
- javascript - 在 Javascript 中,当它们都迭代相同的次数时,为什么 'while(true' 比 'for(...)' 慢?