Brauche Hilfe bei der Lösung eines zweiter Ordnung nicht-lineare ODE in python
Ich weiß wirklich nicht, wo beginnen mit diesem problem, da hatte ich noch nicht viel Erfahrung mit diesem, aber es ist notwendig, dies zu lösen, Teil des Projektes mit Hilfe eines Computers.
Ich habe einen 2nd order ODE die:
m = 1220
k = 35600
g = 17.5
a = 450000
und b ist zwischen 1000 und 10000 mit Schritten von 500.
x(0)= 0
x'(0)= 5
m*x''(t) + b*x'(t) + k*x(t)+a*(x(t))^3 = -m*g
Brauche ich das kleinste b derart, dass die Lösung ist nie positiv. Ich weiß, was das Diagramm Aussehen soll, aber ich weiß einfach nicht, wie zu verwenden odeint um eine Lösung der Differentialgleichung.
Dies ist der code den ich bisher:
from numpy import *
from matplotlib.pylab import *
from scipy.integrate import odeint
m = 1220.0
k = 35600.0
g = 17.5
a = 450000.0
x0= [0.0,5.0]
b = 1000
tmax = 10
dt = 0.01
def fun(x, t):
return (b*x[1]-k*x[0]-a*(x[0]**3)-m*g)*(1.0/m)
t_rk = arange(0,tmax,dt)
sol = odeint(fun, x0, t_rk)
plot(t_rk,sol)
show()
Die nicht wirklich produzieren viel von allem.
Irgendwelche Gedanken? Dank
- Es ist hier ein Beispiel: wiki.scipy.org/Cookbook/CoupledSpringMassSystem
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zum lösen von second-order ODE mit
scipy.integrate.odeint
Sie schreiben sollte, es als ein system von first-order ODEs:Definiere ich
z = [x', x]
, dannz' = [x'', x']
, und das ist Ihr system! Natürlich, stecken Sie in Ihren realen Beziehungen:wird:
Oder, nennen wir es doch einfach
d(z)
:Nun können Sie füttern die
odeint
als solche:(Die
_
ist ein leerer Platzhalter für diex'
variable, die wir gemacht)Minimieren
b
unterliegen der Einschränkung, dass das maximum vonx
ist immer negativ, Sie könnenscipy.optimize.minimize
. Ich werde es implementieren, indem Sie wirklich die Maximierung der maximalx
vorbehaltlich der Einschränkung, dass es weiterhin negativ, denn ich kann nicht daran denken, wie zur Minimierung eines Parameters, ohne in der Lage zu invertieren die Funktion.odeint
unterstützt broadcasting der Argumente.d(z)
es nicht, ich soll zurück kommen und es beheben, aber habe es vergessen.y, x = odeint(...)
oder sogarz = odeint(...)
, daodeint
gibt ein array mit der ersten dimension von2
kann ich "entpacken" es. Ich entschied mich für die Verwendung_
weil ich habe keine Verwendung für diey
Teil der Reihe, denn es stelltx'
, die ich nicht brauchen. Ich könnte alternativ dazu getan haben:x = odeint(...)[1,:]
_
als Variablennamen in Python.Ich glaube nicht, können Sie Ihr problem lösen wie gesagt: Ihre ersten Bedingungen, mit
x = 0
undx' > 0
implizieren, dass die Lösung positiv sein wird für einige Werte, die sehr nahe an den Ausgangspunkt. Es gibt also keineb
für das die Lösung ist nie positiv...Abgesehen davon zu lösen zweiter Ordnung differentialgleichungen, müssen Sie zuerst, um zu umschreiben, dass es als ein system von zwei Erster Ordnung differentialgleichungen. Definition
y = x'
wir können schreiben Sie Ihre einzige Gleichung:Damit Ihre Funktion sollte in etwa so Aussehen:
Und Sie können sich lösen und Plotten von Gleichungen zu tun:
'
ist nur Schreibweise zu erklären, die Gleichung nicht, setzte Sie in Ihrem code. Der eigentliche code ist gegeben durchfun
oder (d
in meiner Antwort), wo statt derx' = y
undy' = blah
schreiben Siefun([x, y]) = [y, blah]