提问人:Mark Bartnik 提问时间:11/14/2023 最后编辑:Mark Bartnik 更新时间:11/14/2023 访问量:29
Python 中的微分方程组与射击方法
System of differential equations in Python with the shooting method
问:
我在 python 中求解 deifferential 方程时遇到了一些问题。你能告诉我,我有没有意识到正确的拍摄方法和欧拉方法吗?我有非线性二阶微分方程组,边界条件为 0 和 1。 我使用割线方法查找函数 g,f 为 1 的值。该程序的输出为 0,0,看起来它没有计算任何东西,因为程序立即运行。我已经检查过了,它进入了循环,但它根本无法计算。
import numpy as np
import matplotlib.pyplot as plt
#Friedbierg-Lee-Sirlin Q-Balls
#Boundary conditions and parameters
k=1
m=0.25
w=0.85
z_one=0
n_one=0
g_zero=1
f_zero=0
#Equations
#r=[0,inf), x=[0,1)
def r(x):
return -np.log(x)
def dz(z,x,f,g):
return (1/x**2) * (k*g**2*f - w**2*f - x*z - (2*x/np.log(x)*z))
def dn(n,x,f,g):
return (1/x**2) * (k*f**2*g - 2*m*g*(1-g**2) - x*n - (2*x/np.log(x)*n))
def dg(n):
return n
def df(z):
return z
f=np.zeros(10001)
g=np.zeros(10001)
z=np.zeros(2)
n=np.zeros(2)
#Euler's method
def euler_method(t1,t2):
x0=1
h=0.0001
z[0]=z_one
n[0]=n_one
g[0]=t2
f[0]=t1
x=x0
k=0
while x>(1-9999*0.0001):
k+=1
x-=k*h
z[1]=z[0]-h*dz(z[0],x,f[k-1],g[k-1])
n[1]=n[0]-h*dn(n[0],x,f[k-1],g[k-1])
f[k]=f[k-1]-h*df(z[0])
g[k]=g[k-1]-h*dg(n[0])
z[0], n[0]= z[1], n[1]
return f[9999],g[9999]
#Shooting method
def shooting_method():
e=0.00001
x1=np.zeros(100)
x2=np.zeros(100)
x1[0]=0
x2[0]=1
y1,y2= euler_method(x1[0],x2[0])
x1[1]=0.1
x2[1]=1.05
y3,y4= euler_method(x1[1],x2[1])
i=1
while (abs(y3-f_zero)>e) and (abs(y4-g_zero)>e) and (i<100):
i+=1
x1[i]= x1[i-1] - (y3-f_zero)*(x1[i-1]-x1[i-2])/(y3-y1)
x2[i]= x2[i-1] - (y4-g_zero)*(x2[i-1]-x2[i-2])/(y4-y2)
y1,y2= euler_method(x1[i-1],x2[i-1])
y3,y4= euler_method(x1[i],x2[i])
return y3,y4
答: 暂无答案
评论