ฉันมีระบบสมการเชิงอนุพันธ์สองแบบ:
dri/dt=tan(al)
dal/dt=(vz-C_alz)/C_aln
โดยที่ vz
เรียกว่านิพจน์ซึ่งขึ้นอยู่กับ l
, C_alz
และ C_aln
เท่านั้น ซึ่งเป็นนิพจน์สองรายการของตัวแปร ri
และ al
(นิพจน์ทางคณิตศาสตร์เหล่านี้แสดงในโค้ดด้านล่าง) ตอนนี้ฉันต้องการใช้ Odeint ใน python เพื่อแก้สมการเชิงอนุพันธ์ทั้งสองนี้ด้วยค่าเริ่มต้นที่ทราบสองค่า ri(0)=2.5, al(0)=0.1
และรับ ri(l)
และ al(l)
ในช่วง l
[0, 36, 100]`
from sympy import sqrt, sin, cos, tan, atan
import matplotlib.pyplot as pl
import numpy as np
from scipy.integrate import odeint
def func(w,l):
ri, al = w
C_aln= 0.0240566430653894*ri*sin(al + 11) - 3.8*sqrt((-sin(al + 11) + 1)/(1 + 3.8*sqrt(2)/ri))*(-ri**2/2401 + 1)*cos(al + 11)/(-sin(al + 11) + 1)
C_alz= -484*ri**2/1097257 + (-0.00633069554352353*ri*sqrt((-sin(al + 11) + 1)/(1 + 3.8*sqrt(2)/ri)) - 0.0240566430653894*cos(al + 11) + 14.44*sqrt(2)*sqrt((-sin(al + 11) + 1)/(1 + 3.8*sqrt(2)/ri))*(-ri**2/2401 + 1)/(ri**2*(1 + 3.8*sqrt(2)/ri)))*tan(al) + 1
vz=(-0.00420681454754192*l**2 + 0.180893025544303*l - 0.960117265980565)*(-0.00633069554352353*sqrt((sin(atan(0.00420681454754192*l**2 - 0.180893025544303*l + 0.960117265980565) - 11) + 1)/(1 + 3.8*sqrt(2)/(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417)))*(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417) + 14.44*sqrt(2)*sqrt((sin(atan(0.00420681454754192*l**2 - 0.180893025544303*l + 0.960117265980565) - 11) + 1)/(1 + 3.8*sqrt(2)/(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417)))*(-(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417)**2/2401 + 1)/((1 + 3.8*sqrt(2)/(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417))*(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417)**2) - 0.0240566430653894*cos(atan(0.00420681454754192*l**2 - 0.180893025544303*l + 0.960117265980565) - 11)) - 484*(-0.00140227151584731*l**3 + 0.0904465127721514*l**2 - 0.960117265980565*l + 5.26992086596417)**2/1097257 + 1
f=[tan(al), (vz-C_alz)/C_aln]
return f
init = [2.5, 0.1]
l = np.linspace(0,36,100)
sol=odeint(func, init, l)
pl.figure(1)
pl.plot(l, sol[:,0], color='b')
pl.legend()
pl.show()
ปัญหาของฉันคือ:
สามารถคำนวณได้เฉพาะค่าตัวเลขสามตัวแรกของ ri
ส่วนค่าอื่นๆ จะเป็นศูนย์
ในเวลาเดียวกัน ฉันได้รับข้อความแสดงข้อผิดพลาด:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
ใครๆ ก็สามารถตอบคำถามของฉันได้:
- ฉันใช้ odeint ในโค้ดอย่างถูกต้องหรือไม่ (ฉันค่อนข้างแน่ใจว่านิพจน์ทางคณิตศาสตร์นั้นถูกต้อง)
- เกิดอะไรขึ้นกับผลลัพธ์ที่คำนวณและกราฟิกของฉัน ฉันจะทำให้ผลลัพธ์ไม่เต็มได้อย่างไร ฉันได้ลองเปลี่ยนพารามิเตอร์ของ odeint เช่น เปลี่ยน mxstep แต่มันไม่ทำงาน
l
ต่างๆ มันใช้งานได้ในบางช่วง แต่ไม่ใช่ในช่วงอื่น ๆ หรือไม่? - person hpaulj   schedule 06.01.2016