僵硬的颂歌有麻烦(3或4个变量)。不同的求解器产生差图,它们都不对

时间:2018-10-25 09:54:15

标签: python ode

这是我的最后一个解决方案,但是我已经尝试解决了大约一个月,但没有成功。

我尝试了“ RK45”,“ Radau”,“ BDF”以及所有其他功能。大多数情况下,我会收到错误消息,但是即使我不这样做,解决方案也不是人们期望的那种解决方案。我还尝试了两种集成方式,它们的预期结果相同,但得到的结果不同。

让我先说明问题,这是天体物理学中的RMHD问题,因此我将不作详细介绍,而只发布最后两种形式:

第一部分 :常数和起点

变量:G2,Xi,Ps “时间” :th

import scipy.integrate
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve

GG=4/3

h=10.0E-7
c0=1.2682705605
th0=0.6108652382
G20=1
M20=1
sm=5000.00025 
F=1.01
xa2=0.99
mu=2.02321724*sm
q=37.3962418
pa=-0.0392874714
G20=1-2*np.cos(c0)*1/(np.sin(th0)*np.cos(th0+c0))*h
M20=1-xa2-pa*h
th0=th0-h

第二部分 y'= f(y,th)问题的形式

首先是补充功能:

def M(z,s):
    return q*z[0]/(z[0]-1)**(1/(GG-1))
def Gx(z,s):
    return 2*z[2]*np.cos(z[1])/(np.sin(s)*np.cos(s+z[1]))
def y(z,s):
    return 1-M(z,s)-z[2]*xa2
def x(z,s):
    return 1-M(z,s)-xa2
def B(z,s):
    return z[2]-M(z,s)-z[2]*xa2
def r1(z,s):
    return q/((z[0]-1)**(GG/(GG-1)))*(z[0]*(GG-2)-(GG-1))/(GG-1)
def d1(z,s):
    return 2*mu**2*(x(z,s)**2/y(z,s)**3+B(z,s)*xa2/z[2]/y(z,s)**2-x(z,s)/y(z,s)**2-xa2*B(z,s)**2/z[2]/y(z,s)**3)-F*F*sm**2/xa2**2*(2*M(z,s)*np.sin(s)**2/np.cos(z[1]+s)**2/z[2]**2)
def d2(z,s):
    return 2*mu**2*(x(z,s)**2*xa2/y(z,s)**3-xa2**2*B(z,s)**2/z[2]/y(z,s)**3+xa2*B(z,s)**2/2/z[2]**2/y(z,s)**2-B(z,s)*xa2*(1-xa2)/z[2]/y(z,s)**2)+2*F*F*sm**2*M(z,s)**2*np.sin(s)**2/xa2**2/z[2]**3/np.cos(z[1]+s)**2
def d3(z,s):
    return F*F*sm**2*2*M(z,s)**2*np.sin(s)**2*np.sin(s+z[1])/xa2**2/z[2]**2/np.cos(s+z[1])**3
def d4(z,s):
    return -F*F*sm**2*(2*M(z,s)**2*np.sin(s)*np.cos(s))/(xa2**2*z[2]**2*np.cos(s+z[1])**2)
def d5(z,s):
    return np.sin(s)**2*y(z,s)/np.cos(s+z[1])**2
def d6(z,s):
    return (r1(z,s)*d1(z,s)-2*z[0])/d3(z,s)
def Gx(z,s):
    return 2*z[2]*np.cos(z[1])/(np.sin(s)*np.cos(s+z[1]))
def W1(z,s):
    return xa2**3*mu**2*z[2]/(F*F*sm*sm*y(z,s)**2)*((F-1)*(1-z[2])**2-B(z,s)**2/M(z,s))-np.sin(s)**2*(M(z,s)+F*xa2*z[2]-F+1)/(np.cos(s+z[1])**2)+2*(GG-1)*(F-2)*(z[0]*(z[0]-1))*xa2*xa2*z[2]**2/(GG*F*F*sm*sm*M(z,s))
def d7(z,s):
    return np.sin(s)**2*np.tan(s+z[1])*y(z,s)*Gx(z,s)/2/z[2]+np.tan(s+z[1])*Gx(z,s)*xa2*np.sin(s)**2-(Gx(z,s)*d2(z,s)+d4(z,s))/d3(z,s)*d5(z,s)
def P1(z,s):
    return d6(z,s)*d5(z,s)-np.sin(s)**2*np.tan(s+z[1])*r1(z,s)

和数组f:

def KSx(z,s):
        return (d7(z,s)+W1(z,s))/P1(z,s)
def PSx(z,s):
        return KSx(z,s)*d6(z,s)+((Gx(z,s)*d2(z,s)+d4(z,s))/d3(z,s))
def Gx(z,s):
        return 2*z[2]*np.cos(z[1])/(np.sin(s)*np.cos(s+z[1]))

第三部分:集成

首先定义起始状态和集成限制。

还将f函数定义为fun(th,y)或fun(t,z)

T_get是获取图形所需的点。

start=th0
limit=th0-0.610864
z0=np.array([ks0,ps0,g0]) 
def fun(t,z):
    return np.array([KSx(z,th0),PSx(z,th0),Gx(z,th0)])

t_get=np.linspace(start,limit,num=10e3)

最后,使用this集成器和“ BDF”(以及其他所有模式)作为处理严峻问题的方法。

sol = scipy.integrate.solve_ivp(fun, [start, limit], z0, method='BDF',t_eval=t_get, vectorized=False)

第二种形式是使用分母作为“时间”,因此具有

t=ss0=0,并且th是另一个未知变量(以y为单位)

所以

def Ths(fu):
    return P1(fu,fu[3])
def KSs(fu):
    return (d7(fu,fu[3])+W1(fu,fu[3]))
def PSs(fu):
    return PSx(fu,fu[3])*P1(fu,fu[3])
def Gs(fu):
    return Gx(fu,fu[3])*P1(fu,fu[3])

并从y0=[z0,th0]s0=0的状态开始

我不会进入结果部分,因为它们肯定是错误的。我在做错什么吗?我对此很着急,任何帮助都是可以接受的。

0 个答案:

没有答案
相关问题