[英]How to properly implement scipy.integrate.Radau?
(我會感謝一個例子的鏈接,到目前為止我還沒有找到。)
我正在嘗試使用scipy.integrate 中的 Radau 來求解二階微分方程。 現在我只是嘗試一個簡單的例子,這樣我就可以理解它是如何工作的(到目前為止沒有成功)。
假設我有以下等式:
d^2y/dt^2 = C,
這意味着 y = (C t^2)/2 + B t。
例如,假設 y(1) = 1 且 C = 2。假設我想為 t = 10 找到 y 的值。
這是我的代碼:
from scipy.integrate import Radau
import numpy as np
C = 2.0
y = np.zeros(2)
def fun(t, y):
#y[0] = C*t
y[1] = C
return y
t0 = 1.0
y0 = np.array([1., 1.])
t_bound = 10.0
eq = Radau(fun, t0, y0, t_bound)
print(eq.n)
while(True):
print(eq.t)
print(eq.y)
print(eq.status)
if eq.status == 'finished':
break
eq.step()
輸出錯誤。 (如果我取消注釋fun
定義中的注釋行,它也會給出錯誤的答案。但我認為我什至不必告訴求解器,對嗎?我通常不知道這個值。)
我認為我最大的問題是我不確定應該將什么視為fun
。 文檔說它應該在系統的右側,所以我認為一階推導應該在 y[0] 中,二階推導應該在 y[1] 等中。
我究竟做錯了什么? 這應該如何實施?
Atm 你正在解決
y0' = y0, y0(1)=1
y1' = 2, y1(1)=1
它有解決方案y0(t)=exp(t-1)
和y1(t)=2*t-1
這當然不是你想要的。 你想要一階系統
y0' = y1
y1' = C
所以你需要
def fun(t,y): return [y[1], C]
那么解是y1(t)=C*t+B=2*t-1
和y0(t)=0.5*C*t^2+B*t+A=t^2-t+1
和積分以eq.y = [91. 19.]
eq.y = [91. 19.]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.