簡體   English   中英

如何解決微分方程中的索引誤差?

[英]How to Fix Index Error in Differential Equation?

我正在嘗試創建一個使用后向差分解決質量彈簧阻尼器系統的程序,唯一的問題是我遇到了不確定的索引錯誤,但不確定如何解決:

import numpy as np 
import matplotlib.pyplot as plt

def MSD_Solver(m,b,K):
    #input: m = mass, b = damping ratio, K = spring constant
    #output: (t,x) time vs position

    tinitial = 0
    tfinal = 15
    step = .005

    t = np.linspace(tinitial,tfinal,step)

    x = np.zeros_like(t)

    x[0]=0
    x[1]=0
    for k in range (len(t)-1):            # extra element so subtract by 1
        x[k] = (t**2)/((m+b)*t+(t**2)*k) + (x[k-2](-m))/((m+b)*t+(t**2)*k) + (x[k-1]((2*m)+(b*t)))/((m+b)*t+(t**2)*k)
    return plt.plot(t,x)

print(MSD_Solver(1,.5,5)),MSD_Solver(1,1,5),MSD_Solver(1,2,5)
plt.show()

linspace文檔顯示第三個參數是項數,而不是步驟數。 您的step值被截斷為0,因此返回的t數組為空。 結果, x沒有元素,並且x[0]超出范圍。

嘗試這個:

tinitial = 0
tfinal = 15
step = .005
num = (tfinal - tinitial) / step + 1

t = np.linspace(tinitial,tfinal,num)

這將使您了解復雜計算中的語義錯誤。

您可能想使用一階和二階差商離散化

m*x''(t) + b*x'(t) + K*x(t) = 1

m*(x[j+1]-2*x[j]+x[j-1]) + 0.5*dt*b*(x[j+1]-x[j-1]) + dt^2*K*x[j] = dt**2

以便

x[j+1] = ( dt**2 + (2*m-K*dt**2)*x[j] - (m-0.5*dt*b)*x[j-1] ) / (m+0.5*dt*b)

在代碼中

def MSD_Solver(m,b,K):
    #input: m = mass, b = damping ratio, K = spring constant
    #output: (t,x) time vs position

    tinitial = 0
    tfinal = 15
    step = .005

    t = np.arange(tinitial,tfinal,step)
    x = np.zeros_like(t)

    dt = t[1]-t[0]  # use the actual time step
    x[0:2] = [ 0, 0]
    for j in range(1,len(t)-1):
        x[j+1] = ( dt**2 + (2*m-K*dt**2)*x[j] - (m-0.5*dt*b)*x[j-1] ) / (m+0.5*dt*b)
    return t,x

t,x = MSD_Solver(1,.5,5)        
plt.plot(t,x); plt.show();

解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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