menggunakan Odeint untuk menyelesaikan dua persamaan diferensial orde pertama dengan vektor sebagai masukan [duplikat]

Saya memiliki sistem dua persamaan diferensial:

  1. dri/dt=tan(al)
  2. 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:

  1. sudahkah saya menggunakan odeint dalam kode dengan benar? (Saya yakin ekspresi matematikanya benar)
  2. 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.

person wangmars    schedule 05.01.2016    source sumber
comment
Mirip dengan stackoverflow.com/questions/34618488/   -  person hpaulj    schedule 05.01.2016
comment
Masalah dalam pertanyaan lainnya adalah turunannya meledak ketika variabel integrasi terlalu mendekati 0. Saya menyarankan untuk mengujinya pada berbagai rentang l. Apakah ini berfungsi pada rentang tertentu, tetapi tidak pada rentang lainnya?   -  person hpaulj    schedule 06.01.2016