Ранее я задавал вопрос, где я спрашивал о том, где я обычно ошибался, пытаясь решить BVP здесь: Решение BVP с использованием scipy.solve_bvp, где функция возвращает массив
В одном из ответов, которые я получил, отвечая на это, говорилось, что функция, которую я передавал solve_bvp()
, не имела формы (12,1000) в соответствии с документацией. Я исправил это, создав функцию, которая генерирует решения с требуемой формой, сначала инициализируя массив 12 на 1000, а затем устанавливая каждый из 12 массивов формы 1000 равным значению соответствующего ему дифференциального уравнения для каждого момента времени, в которыймоя функция называется. Код, который я написал ниже, с новым аннотированным кодом.
##find our velocity at time t=-1000, where the BVP is started from
def find_vel_past():
daynum=1000
ts=np.linspace(0,-daynum*day2sec,daynum)
angles=np.zeros([daynum,2])
trange =(ts[0],ts[-1])
fi=np.ndarray.flatten(np.array(rs+vs))
sol= integrate.solve_ivp(earth_mars_motion,trange,fi,t_eval=ts, max_step=3*day2sec,dense_output=True)
return(sol.y[0:6][:,-1])
##return an array of six velocities at this time
def estimate_errors_improved():
daynum=1000
##generating np arrays for bouundary conditions
a=np.ndarray.flatten(np.array(find_vel_past()))
rpast=np.ndarray.flatten(np.array(rspast))
acond=np.concatenate([rpast,a])
bcond=np.ndarray.flatten(np.array(rs+vs))
t=np.linspace(0,daynum*day2sec,daynum)
y=np.zeros(([12,daynum]))
y[:,0]=acond
## THE FUNCTION I HAVE UPDATED AS PER ADVICE RECIEVED
def earth_mars_motion1(t,y):
x=np.zeros([12,daynum])
y1=earth_mars_motion(t,y[:,0])
for i in range(daynum):
for i in range(len(y)):
x[i]=y1[i]
return x
def bc(ya,yb):
a=ya.ravel()[0:6]-bcond[0:6]
b=yb.ravel()[0:6]-rpast
c=np.array([a,b])
return np.reshape(c,(12))
#return np.concatenate(ya.ravel()[0:6]-bcond[0:6],yb.ravel()[0:6]-rpast)
sol = integrate.solve_bvp(earth_mars_motion1,bc,t,y,verbose=1)
data1=np.transpose(sol.sol(t))
angles=np.zeros(daynum)
print(sol.sol(t))
for i in range(daynum):
angles[i]=angle_between_planets(np.transpose(sol.sol(t)[:,0]))
x = t/day2sec
plt.plot(x,angles)
plt.show()
estimate_errors_improved()
Вывод, который я получаю: ValueError: operands could not be broadcast together with shapes (12,999) (12,1000)
. Может ли кто-нибудь предоставить быстрое решение этой проблемы. Благодаря.