Python 中的微分方程组与射击方法

System of differential equations in Python with the shooting method

提问人:Mark Bartnik 提问时间:11/14/2023 最后编辑:Mark Bartnik 更新时间:11/14/2023 访问量:29

问:

我在 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
python-3.x 微分方程

评论

0赞 itprorh66 11/14/2023
欢迎使用 Stack Overflow。请阅读如何提出一个好问题。“我是否意识到正确的拍摄方法和欧拉方法”对我们来说太宽泛了;我们不按照规范编写代码。您应该提前研究问题;想出解决问题的逻辑步骤;弄清楚你卡住的确切位置,并能够显示准确的输入和输出。

答: 暂无答案