• Register

Diferencialna enačba scipy.integrate.ode

+16 votes
220 views

Z reševanjem diferencialne enačbe po Eulerjevi metodi želim dobiti polje pomikov in hitrosti. 

Enačbo sem po mojem pravilno zastavil, problem imam da t_sci ne poteka enako kot polje čas (kot bi moralo) in zato ne dobim pravih rešitev.

Kaj bi moral spremeniti v kodi, da bi se t_sci spreminjal tako kot se spreminja čas ? Torej od časa t_0 (0.0001 s) do časa t_1 ( 0.008 s), s korakom dt (7,188 e-6 s) ? t_sci ima sedaj namreč prvo vrednost nastavljeno - t_0, druga vrednost je pa korak, prištet k ničli. Druga vrednost bi pa morala biti korak, prištet k prejšnji vrednosti. In tako za vsako vrednost naprej.

Prosim za pomoč, če pa opazite napako še kje drugje, kar sporočite :)

čas, dt = np.linspace(t_0, t_1, n, retstep=True)
zac_pogoji = np.array([0, 0])
#Funkcija 1. odvodov
def funk(t,x):
    return np.array([x[1], (F(t) - d*x[1] - k*x[0])/m])


solver = integrate.ode(funk).set_integrator('vode').set_initial_value(zac_pogoji)
t_sci = [t_0]
x_sci = [zac_pogoji]
while solver.successful() and solver.t < t_1:
    solver.integrate(solver.t+dt)
    t_sci.append(solver.t)
    x_sci.append(solver.y)

t_sci = np.array(t_sci)
x_sci = np.array(x_sci)
t_sci
array([  1.00000000e-04,   7.18835305e-06,   1.43767061e-05, ...,
         7.98626024e-03,   7.99344859e-03,   8.00063694e-03])
čas
array([ 0.0001    ,  0.00010719,  0.00011438, ...,  0.00798562,
        0.00799281,  0.008     ])
asked May 17, 2017 by kobalac (3,400 points)

1 Answer

+8 votes
 
Best answer

Rešeno! Dobim pravilen odgovor.

Ko daš začetne vrednosti v funkcijo, lahko definiraš tudi čas teh začetnih vrednosti:

solver.set_initial_value(zac_pogoji, t = t_0)  
Do pomika nato dostopaš: pomik = x_sci[:, 0]

Do hitrosti pa: hitrost = x_sci[:, 1]

answered May 17, 2017 by kobalac (3,400 points)
selected May 18, 2017 by Luka Knez
...