前提・実現したいこと
pythonでループさせて連続で計算させたいです。
大学の研究でニュートン法を用いてある方程式を計算させたいと考えています。
発生している問題・エラーメッセージ
ループさせて計算させている中でIという文字がでてきてしまい、計算が途中で止まってしまいます。 実行結果が以下のようになります。(100回計算させたいのですが、1回目の計算で以下のようになります。) i=1 f=1.0e+16 - (-0.647662078054225*(0.0448846892739288 + 0.0448245261889697*I)**2*(0.999999325352009 + 0.00201193628719176*I)**2 - 0.647662078054225*(0.0448245261889697 + 0.0448846892739288*I)**2*(0.999999325352009 - 0.00201193628719176*I)**2)/(-1.32285202687184e-16*(0.0448245261889697 + 0.0448846892739288*I)**2*(0.999999325352009 - 0.00201193628719176*I)**2 - 1.32285202687184e-16*(0.0448846892739288 + 0.0448245261889697*I)**2*(0.999999325352009 + 0.00201193628719176*I)**2 - 4.67698819353723e-18*(0.0448245261889697 + 0.0448846892739288*I)*(0.634340031478652 + 0.634340031478652*I)*(0.999999325352009 - 0.00201193628719176*I)**2*(0.999999325352009 + 0.00201193628719176*I) - 4.67698819353723e-18*(0.0448846892739288 + 0.0448245261889697*I)*(0.634340031478652 + 0.634340031478652*I)*(0.999999325352009 - 0.00201193628719176*I)*(0.999999325352009 + 0.00201193628719176*I)**2 - 4.67698819353723e-18*(0.0448245261889697 + 0.0448846892739288*I)*(0.0448846892739288 + 0.0448245261889697*I)**2*(0.634340031478652 + 0.634340031478652*I)*(0.999999325352009 + 0.00201193628719176*I) + 4.67698819353723e-18*(0.0448245261889697 + 0.0448846892739288*I)**2*(0.0448846892739288 + 0.0448245261889697*I)*(0.634340031478652 + 0.634340031478652*I)*(0.999999325352009 - 0.00201193628719176*I)) i=2
該当のソースコード
Python
1import sympy 2import math 3x=sympy.Symbol('x') 4L=sympy.Symbol('L') 5p=2200*10**-24 6a=math.pi*1-math.pi*0.66*0.66 7P=2*10**-23/0.1266 8c=27.8*10**9*2 9E=10**12 10I=math.pi/64*(2**4-1.32**4) 11r=(p*a*P*x**4-c*(p*a+P)*x**2)/((c-P*x**2)*E*I) 12B=math.sqrt(2)/2*r**(1/4) 13H=r*(sympy.cosh(B*L)**2*sympy.sin(B*L)**2+sympy.sinh(B*L)**2*sympy.cos(B*L)**2) 14dh=sympy.diff(H,x) 15i=0 16f=10.0**16 17L1=0 18for L1 in [0.1*x for x in range(1,101,3)]: 19 i=0 20 f=10.0**16 21 while i<=100: 22 f2=f-H.subs([(x,f),(L,L1)])/dh.subs([(x,f),(L,L1)]) 23 f=f2 24 i+=1 25 print('i={0}'.format(i)) 26 print('f={0}'.format(f)) 27 if i==100: 28 print(f)
試したこと
別の計算式で同じプログラムを試すとうまくいきます。
以下がうまくいったコードです。
import sympy
import math
x=sympy.Symbol('x')
L=sympy.Symbol('L')
p=220010**-24
a=math.pi1-math.pi0.660.66
P=210**-23/0.1266
c=27.8109*2
E=1012
I=math.pi/64*(24-1.324)
r=(paPx**4-c(pa+P)x**2)/((c-Px**2)EI)
B=(-1r)(1/4)
H=-4rsympy.sinh(B*L)sympy.sin(BL)
dh=sympy.diff(H,x)
i=0
f=10.016
L1=0
for L1 in [0.1*x for x in range(1,101,3)]:
i=0
f=10.0**16
print(L1)
while i<=100:
f2=f-H.subs([(x,f),(L,L1)])/dh.subs([(x,f),(L,L1)])
f=f2
i+=1
if i==100:
print(f)
補足情報(FW/ツールのバージョンなど)
開発環境はAnacondaのJupyterを用いています。