sympy.Symbol()
例如,我正在以變數為的方程串列的形式生成一個 ODE 系統[3*sympy.Symbol('x')**3 sympy.Symbol('y') , sympy.Symbol('x')-sympy.Symbol('y')**4]
。
所以使用這個例子,我可以通過代碼解決這個系統
import numpy as np
from sympy import Symbol
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def kin(t, z):
x, y = z
eqs = [3*x**3 y , x-y**4]
return eqs
y0 = [0, 10]
t = np.linspace(0, 10000, 10000)
sol = solve_ivp(kin, [0, 10000], y0, dense_output=True)
print(sol.sol(t).T)
plt.plot(t, sol.sol(t).T)
plt.show()
它會給出這個結果https://imgur.com/3KvOkrU
但由于 和 的變數x
實際上y
是由不同的代碼生成的,我想我可以做到
import numpy as np
from sympy import Symbol
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
dic = {'x': Symbol('x'), 'y': Symbol('y')}
vars = ('x', 'y')
#eqs =[3x^3 y , x-y^4]
eqs = [3*dic[vars[0]]**3 dic[vars[1]], dic[vars[0]]-dic[vars[1]]**4]
def kin(t, z):
dics = {}
for v in range(len(vars)):
dics[vars[v]] = z[v]
for e in range(len(eqs)):
eqs[e] = eqs[e].subs(dics)
return eqs
y0 = [0, 10]
t = np.linspace(0, 10000, 10000)
sol = solve_ivp(kin, [0, 10000], y0, dense_output=True)
print(sol.sol(t).T)
plt.plot(t, sol.sol(t).T)
plt.show()
它僅用 and 替換第一部分的值x
和值,但此代碼的輸出完全不同https://imgur.com/ovi3mk8y
z[0]
z[1]
我看不出問題出在哪里,如果有人代碼指出問題出在哪里或幫助我找到一種方法來評估這些自動生成的 ODE 系統,我將不勝感激。
uj5u.com熱心網友回復:
您獲得該結果的原因是因為您在每次迭代時都eqs
在內部覆寫。kin
此外,正如 Lutz 所提到的,您應該使用lambdify
which 將符號運算式轉換為數值函式,以便 Numpy 可以評估它們(更快)。
import numpy as np
from sympy import Symbol
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
dic = {'x': Symbol('x'), 'y': Symbol('y')}
vars = ('x', 'y')
eqs = [3*dic[vars[0]]**3 dic[vars[1]], dic[vars[0]]-dic[vars[1]]**4]
# convert symbolic expressions to numerical functions
eqs = [lambdify(list(dic.values()), e) for e in eqs]
def kin(t, z):
# evaluate each numerical function with the current values
return [e(*z) for e in eqs]
y0 = [0, 10]
t = np.linspace(0, 10000, 10000)
sol = solve_ivp(kin, [0, 10000], y0, dense_output=True)
plt.plot(t, sol.sol(t).T)
plt.show()
這將為您提供您發布的第一張圖片。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475606.html