几周来,我一直试图将ODE的这一部分翻译成python,但在运行它时,我经常遇到不同的错误。我认为我对solve_bvp
的理解是一般的,但我不能弄清楚我做错了什么。我一直在阅读库的文档,了解各个函数是如何工作的,但几周后我觉得自己并没有真正理解它。
问题:
的数据
这就是我试图重新创建的数学,下面是我想出的代码。
import numpy as np
import scipy
#Constants#
P1 = 0.05
P2 = 0.1
Tau = 0.5
W = 1
Uh = 1
Uv = 1.562
Bv1 = 1.59
Bv2 = 1.59
A1 = 1.2
A2 = 0.8
Roe1 = 0.177
Roe2 = 0.177
Nh = 9.3
Nv = 128
Qh = 10
Qv = 100
H = 1
#g is lamda this variable will change with time#
#This is variable test area#
g = 1
BH1 = 1
BH2 = 2
x1 = np.array([0, 1])
x2 = (0, 1)
t = np.linspace(0, 1, num=365)
#############################################
i = input('What is the value of i?')
i = ([int(i)])
#Functions#
def Bhinv(i):
if i == 1:
l = BH1*min(Nv/(Qv*int(Nh)), 1)+int(Roe1)*H*min(Nv/(Qh*int(Nh)), 1)
return l
if i == 2:
l = BH2*min(Nv/(Qv*Nh), 1)+Roe2*H*min(Nv/(Qh*Nh), 1)
return l
else:
return print("Null")
def sys1(x1, x2, i):
if i.all() == 1:
dx1dt = ((int(P1)/g)-1)*Uh*x1[0] + \
(((int(Bhinv(1)))/g)*(int(Nh)/Nv)*x2[0])
dx2dt = ((int(Bv1)/g)*(Nv/Nh)*x1[0])-int(Uv)*x2[0]
return dx1dt, dx2dt
if i.all() == 2:
dx1dt = ((P2/g)-1)*Uh*x1(t)+(((BH2)/g)*(Nh/Nv)*x2(t))
dx2dt = ((Bv2/g)*(Nv/Nh)*x1(t))-Uv*x2(t)
return dx1dt, dx1dt
# BRN(Bhi) (i = 1,2)
def step1(x1, x2):
x1 = 1
x2 = 0
return np.array([1, 0, 0])
y = ([0, 0],
[0, 0])
v1s1 = scipy.integrate.solve_bvp(sys1, step1, x1, y, x2, y)
字符串
我正在处理的当前错误是IndexError: too many indices for array
。
1条答案
按热度按时间vuktfyat1#
这不是边值问题,而是初值问题。可以使用
scipy.integrate.solve_ivp
解决这些问题。由于这是一个很大的问题(您需要针对i=1
和i=2
求解它,并优化值beta_h1
、beta_h2
和lambda
以实现某些条件),因此我对所有这些未知数使用值1,并仅针对i=1
的情况实现求解器。字符串
这个代码并不完美。你有大量的变量,通常会传递给函数,但我采取了懒惰的路线,把它们留在全局范围内。这不是一个好的实践,但这是我为了简单而做的。