0

次の連立方程式の解を実装しました

dy/dt = -t*y(t) - x(t)
dx/dt = 2*x(t) - y(t)^3

y(0) = x(0) = 1.
0 <= t <= 20

最初は Mathematica で、その後 Python で。

Mathematica での私のコード:

s = NDSolve[
{x'[t] == -t*y[t] - x[t], y'[t] == 2 x[t] - y[t]^3, x[0] == y[0] == 1},
{x, y}, {t, 20}]

ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 20}]

そこから、次のプロットを取得します: Plot1 (403 Forbidden メッセージが表示された場合は、URL フィールド内で Enter キーを押してください)

後で、同じものを python にコーディングしました。

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

g = lambda t: t

def f(z,t):
    xi = z[0]
    yi = z[1]
    gi = z[2]

    f1 = -gi*yi-xi
    f2 = 2*xi-yi**3
    return [f1,f2]

# Initial Conditions
x0 = 1.
y0 = 1.
g0 = g(0)
z0 = [x0,y0,g0]
t= np.linspace(0,20.,1000)

# Solve the ODEs
soln = odeint(f,z0,t)
x = soln[:,0]
y = soln[:,1]

plt.plot(x,y)
plt.show()

そして、これは私が得るプロットです: Plot2 (403 Forbidden メッセージが表示された場合は、URL フィールド内で Enter キーを押してください)

Mathematica の解をより小さなフィールドで再度プロットすると、次のようになります。

ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 6}]

Python ソリューションと同様の結果が得られます。軸だけがずれます。

プロットに大きな違いがあるのはなぜですか?私は何を間違っていますか?

特に f1 が計算される場所で、モデルの Python 実装が間違っていると思われます。あるいは、この場合のように、パラメトリック方程式をプロットするのに plot() 関数がまったく役に立たないかもしれません。

ありがとう。

追伸:テキスト内の画像を平手打ちしないことであなたの人生を難しくして申し訳ありません。まだ評判が足りない。

4

1 に答える 1

0

t個別のパラメーターとしてではなく、入力ベクトルの 3 番目のパラメーターとして使用しています。tinは使用f(z,t)されません。代わりに を使用します。これは、( )の前に定義しz[2]た の範囲と等しくなりません。関数 forはここでは役に立ちません: を設定するために一度だけ使用しますが、その後は決して使用しません。tt=np.linspace(0,20.,1000)lambdagt0

コードを簡素化し、その 3 番目のパラメーターを入力ベクトル (およびラムダ関数) から削除します。例えば:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def f(z,t):
    xi = z[0]
    yi = z[1]

    f1 = -t*yi-xi
    f2 = 2*xi-yi**3
    return [f1,f2]

# Initial Conditions
x0 = 1.
y0 = 1.
#t= np.linspace(0,20.,1000)
t = np.linspace(0, 10., 100)

# Solve the ODEs
soln = odeint(f,[x0,y0],t)
x = soln[:,0]
y = soln[:,1]

ax = plt.axes()
#plt.plot(x,y)
plt.plot(t,x)
# Put those axes at their 0 value position
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#plt.axis([-0.085, 0.085, -0.05, 0.07])
plt.show()

私はあなたが望む実際のプロットをコメントアウトしましxt. 私が得る図:

ここに画像の説明を入力

于 2014-06-03T09:51:29.770 に答える