簡體   English   中英

如何正確實施 scipy.integrate.Radau?

[英]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-1y0(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM