前提・実現したいこと
ここに質問の内容を詳しく書いてください。
pythonで最適化システムを作っています。
超越方程式の解を変数で出し(一般解)、他の式の変数に入れる機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージの読み方が分かりません。
つまりどのファイルのどの行に何が起こっていると言われているのか
教えていただきたいです。
ソースコードが長いですが、コード内の#ここから #ここまでを追加するとこのエラーが出るようになりました。
OpenGoddard.optimizeは以下のコードです。
https://github.com/istellartech/OpenGoddard/blob/master/OpenGoddard/optimize.py
エラーメッセージ
0.01
---- iteration : 1 ----
[ 0. 0.01036504 0.03471855 0.07291493 0.12484478 0.19036281
0.26928628 0.36139515 0.46643267 0.58410607 0.71408738 0.8560143
1.00949126 1.17409048 1.34935321 1.53479094 1.72988684 1.93409712
2.14685263 2.36756038 2.5956052 2.83035151 3.07114501 3.31731459
3.5681741 3.82302438 4.08115509 4.34184679 4.60437288 4.86800166
5.13199834 5.39562712 5.65815321 5.91884491 6.17697562 6.4318259
6.68268541 6.92885499 7.16964849 7.4043948 7.63243962 7.85314737
8.06590288 8.27011316 8.46520906 8.65064679 8.82590952 8.99050874
9.1439857 9.28591262 9.41589393 9.53356733 9.63860485 9.73071372
9.80963719 9.87515522 9.92708507 9.96528145 9.98963496 10. ]
<class 'numpy.ndarray'>
Traceback (most recent call last):
File "Low_Thrust_Orbit_Transfer17.py", line 222, in <module>
prob.solve(obj, display_func, ftol=1e-12)
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGoddard\optimize.py", line 683, in solve
"ftol": ftol})
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize_minimize.py", line 611, in minimize
constraints, callback=callback, **options)
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\slsqp.py", line 313, in _minimize_slsqp
for c in cons['eq']]))
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\slsqp.py", line 313, in <listcomp>
for c in cons['eq']]))
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGoddard\optimize.py", line 649, in for_solver
return func(arg0, arg1)
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenGoddard\optimize.py", line 620, in equality_add
dx = self.dynamics[i](self, obj, i)
File "Low_Thrust_Orbit_Transfer17.py", line 56, in dynamics
s = optimize.fsolve(h,0)
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\minpack.py", line 148, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:\Users\yokotalab\AppData\Local\Programs\Python\Python36-32\lib\site-packages\scipy\optimize\minpack.py", line 227, in _root_hybr
ml, mu, epsfcn, factor, diag)
ValueError: The array returned by a function changed size between calls
class Orbiter:
def init(self):
self.a0 = 1.0 self.vr0 = 0.0 self.vt0 = 1.0 self.af = 4.0 self.vrf = 0.0 self.vtf = 0.5 self.e_0 = 0.7 self.ef = 0.0 self.tf_max = 1000 self.mu = 3.98e14 self.R = 6678000 self.u_max = 0.01 print(self.u_max)
def dynamics(prob, obj, section):
a = prob.states(0, section) vr = prob.states(1, section) vt = prob.states(2, section) beta = prob.states(3, section) e = prob.states(4, section) ur1 = prob.controls(0, section) ur2 = prob.controls(1, section) ut1 = prob.controls(2, section) ut2 = prob.controls(3, section) t = prob.time_update()#ここから print(t) print(type(t)) def f(E): return E - np.cos(E) def g(E): return np.sqrt(obj.mu/obj.R**3)* t def h(E): return f(E)-g(E) s = optimize.fsolve(h,0) r = a * (1 -e * np.cos(s))#ここまで dx[0] = vr dx[1] = vt**2 / r - 1 / r**2 + (ur1 - ur2) -(ui1 - ui2) / np.cos(beta) * np.sin(beta) dx[2] = - vr * vt / r + (ut1 - ut2) return dx()
def equality(prob, obj):
a = prob.states_all_section(0)
vr = prob.states_all_section(1)
vt = prob.states_all_section(2)
e = prob.states_all_section(3)
ur1 = prob.controls_all_section(0)
ur2 = prob.controls_all_section(1)
ut1 = prob.controls_all_section(2)
ut2 = prob.controls_all_section(3)
tf = prob.time_final(-1) result = Condition() # event condition result.equal(a[0], obj.a0) result.equal(vr[0], obj.vr0) result.equal(vt[0], obj.vt0) result.equal(e[0], obj.e_0) result.equal(a[-1], obj.af) result.equal(vr[-1], obj.vrf) result.equal(vt[-1], obj.vtf) result.equal(e[-1], obj.ef) return result()
def inequality(prob, obj):
a = prob.states_all_section(0)
vr = prob.states_all_section(1)
vt = prob.states_all_section(2)
e = prob.states_all_section(3)
ur1 = prob.controls_all_section(0)
ur2 = prob.controls_all_section(1)
ut1 = prob.controls_all_section(2)
ut2 = prob.controls_all_section(3)
tf = prob.time_final(-1) result = Condition() # lower bounds result.lower_bound(a, obj.a0) result.lower_bound(e, 0.0) result.lower_bound(ur1, 0.0) result.lower_bound(ut1, 0.0) result.lower_bound(ur2, 0.0) result.lower_bound(ut2, 0.0) result.lower_bound(tf, 0.0) # upper bounds result.upper_bound(a, obj.af) result.upper_bound(e, obj.e_0) result.upper_bound(ur1, obj.u_max) result.upper_bound(ut1, obj.u_max) result.upper_bound(ur2, obj.u_max) result.upper_bound(ut2, obj.u_max) result.upper_bound(tf, obj.tf_max) return result()
def cost(prob, obj):
return 0.0
def running_cost(prob, obj):
tf = prob.time_final(-1) return tf
========================
plt.close("all")
plt.ion()
Program Starting Point
time_init = [0.0, 10]
n = [60]
num_states = [5]
num_controls = [4]
max_iteration = 8
flag_savefig = True
savefig_dir = "10_Low_Thrust_Orbit_Transfer/"
------------------------
set OpenGoddard class for algorithm determination
prob = Problem(time_init, n, num_states, num_controls, max_iteration)
obj = Orbiter()
========================
Initial parameter guess
a_init = Guess.linear(prob.time_all_section, obj.a0, obj.af)
Guess.plot(prob.time_all_section, r_init, "r", "time", "r")
if(flag_savefig):plt.savefig(savefig_dir + "guess_r" + savefig_add + ".png")
vr_init = Guess.linear(prob.time_all_section, obj.vr0, obj.vrf)
Guess.plot(prob.time_all_section, vr_init, "vr", "time", "vr")
if(flag_savefig):plt.savefig(savefig_dir + "guess_vr" + savefig_add + ".png")
vt_init = Guess.linear(prob.time_all_section, obj.vt0, obj.vtf)
Guess.plot(prob.time_all_section, theta_init, "vt", "time", "vt")
if(flag_savefig):plt.savefig(savefig_dir + "guess_vt" + savefig_add + ".png")
ur1_init = Guess.linear(prob.time_all_section, obj.u_max, obj.u_max)
Guess.plot(prob.time_all_section, ur1_init, "ur1", "time", "ur1")
if(flag_savefig):plt.savefig(savefig_dir + "guess_ur1" + savefig_add + ".png")
ut1_init = Guess.linear(prob.time_all_section, obj.u_max, obj.u_max)
Guess.plot(prob.time_all_section, ut1_init, "ut1", "time", "ut1")
if(flag_savefig):plt.savefig(savefig_dir + "guess_ut1" + savefig_add + ".png")
e_init = Guess.linear(prob.time_all_section, obj.e_0, obj.ef)
prob.set_states_all_section(0, a_init)
prob.set_states_all_section(1, vr_init)
prob.set_states_all_section(2, vt_init)
prob.set_states_all_section(3, e_init)
prob.set_controls_all_section(0, ur1_init)
prob.set_controls_all_section(2, ut1_init)
========================
Main Process
Assign problem to SQP solver
prob.dynamics = [dynamics]
prob.knot_states_smooth = []
prob.cost = cost
prob.running_cost = running_cost
prob.equality = equality
prob.inequality = inequality
def display_func():
tf = prob.time_final(-1)
print("tf: {0:.5f}".format(tf))
prob.solve(obj, display_func, ftol=1e-12)
========================
Post Process
------------------------
Convert parameter vector to variable
a = prob.states_all_section(0)
vr = prob.states_all_section(1)
vt = prob.states_all_section(2)
beta = prob.states_all_section(3)
e = prob.states_all_section(4)
ur1 = prob.controls_all_section(0)
ur2 = prob.controls_all_section(1)
ut1 = prob.controls_all_section(2)
ut2 = prob.controls_all_section(3)
time = prob.time_update()
def f(E):
return E - np.cos(E)
def g(E):
return np.sqrt(obj.mu/obj.R**3)* time
def h(E):
return f(E)-g(E)
s = optimize.fsolve(h,0)
print(s)
r = a * (1 -e * np.cos(s))
aa= sum(np.abs(ut1)+np.abs(ut2))
b= sum(np.abs(ur1)+np.abs(ur2))
c= sum(np.abs(ui1)+np.abs(ui2))
print(aa0.001obj.mu / obj.R2)
print((b+c)0.001obj.mu / obj.R2)
plt.show()
回答2件
あなたの回答
tips
プレビュー