Saya memiliki sistem dua persamaan diferensial:
dri/dt=tan(al)
dal/dt=(vz-C_alz)/C_aln
dengan vz
dikenal sebagai ekspresi yang hanya bergantung pada l
, C_alz
dan C_aln
adalah dua ekspresi variabel ri
dan al
(Ekspresi matematika ini ditunjukkan pada kode di bawah). Sekarang saya ingin menggunakan Odeint dengan python untuk menyelesaikan dua persamaan diferensial ini dengan dua nilai awal yang diketahui ri(0)=2.5, al(0)=0.1
, dan mendapatkan ri(l)
dan al(l)
dalam kisaran 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()
Masalah saya adalah:
hanya tiga nilai numerik pertama ri
yang dapat dihitung, nilai lainnya adalah nol.
pada saat yang sama saya mendapat pesan kesalahan:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
ada yang bisa menjawab pertanyaan saya:
- sudahkah saya menggunakan odeint dalam kode dengan benar? (Saya yakin ekspresi matematikanya benar)
- apa yang salah dengan hasil perhitungan dan grafik saya, bagaimana caranya agar outputnya tidak penuh? Saya sudah mencoba mengubah parameter odeint, misalnya mengubah mxstep, tetapi tidak berhasil.
l
. Apakah ini berfungsi pada rentang tertentu, tetapi tidak pada rentang lainnya? - person hpaulj   schedule 06.01.2016