Я пытаюсь замедлить ракету в космосе, когда она приближается к Марсу для выхода на последнюю орбиту. Я пытаюсь использоватьsolve_bvp для описания положения и скорости ракеты при ее замедлении. Код следующий.
При запуске этого кода решателю не удается сходиться, и появляется сообщение: «При решении системы коллокации обнаружен сингулярный якобиан». Как я могу это исправить? Спасибо за помощь.
импортируйте numpy как np
из scipy.integrate importsolve_ivp,solve_bvp
импортируйте matplotlib.pyplot как plt< /p>
Определите необходимые константы
Cd = .2
A = 11,4 # m^2
G = 6,673 * 10-11# Нм2/кг2
м1 = 5,97219 * 1024 # кг
re = 6,371 * 10**6 # м
Isp = 300 # сек
Isp2 = 450 # сек
g0 = 9,81 # м/с^2
p0 = 101325 # Па
M = .0289652 # кг/моль
R = 8,31446 # Дж/(моль*К)
T0 = 288,15 # K
L = .0065 # К/м
сухая_масса = 21000 # кг
slv_mass = 2300 # кг
масса_топлива = 2180 # кг
этап1_топливная_масса = 200000 # кг
этап2_топливная_масса = 50000 # кг
замедление_топливной_массы = ступень2_топливная_масса
общая_масса = сухая_масса + ступень1_топливная_масса + ступень2_масса_топлива + масса_полезной нагрузки + slv_mass + deceleration_fuel_mass
total_mass_2 = stage2_fuel_mass + полезная нагрузка_масса + slv_mass + deceleration_fuel_mass
m2dot = 2100 # кг/с
m2dot2 = 400 # кг/с
total_mass_3 = payload_mass + slv_mass + deceleration_fuel_mass
required_velocity = 3000
#ta,tb = sol2.t[-1],sol2.t[-1]+900
ta,tb = 0,900
#va,vb = sol2.y[1][-1], требуемая_скорость
va,vb = 40000, требуемая_скорость
def fun3 (t,S):
h,v = S
dhdt = v
dvdt = (m2dot2*(-Isp2g0+v))/((total_mass_3)-m2dot2< /em>t)
return np.vstack([dhdt,dvdt])
def bc(Sa,Sb):
bc1 = Sa[1] - va
bc2 = Sb[1] - vb
return np.array([bc1,bc2])
t_bvp = np.linspace(ta,tb,1000 )
S = np.zeros((2,t_bvp.size))
sol3 =solve_bvp(fun3, bc, t_bvp, S, max_nodes = 10000)
print(sol3)
Я пробовал изменять различные заданные граничные значения. Например, если я изменю первое граничное условие на Sa[0] вместо Sa[1], сделав его ссылкой на первое значение переменной состояния, просто в качестве эксперимента. При этом в коде не возникает проблем с точкой Якобиана, и если я увеличиваю максимальное количество узлов, это фактически решается. Конечно, это без граничных значений, которые я хочу использовать. Я думаю, это означает, что с моими границами что-то не так, и я не совсем уверен, что это может быть.
Подробнее здесь: https://stackoverflow.com/questions/784 ... -solve-bvp