簡體   English   中英

傳遞大量時間相關數據以求解 python 中的微分方程,

[英]Passing large time dependent data to solve differential equation in python,

考慮這個簡單的一階微分方程:

文本

其中 k 是一個常數,值為 0.5 和文本是隨時間變化的變量。

我使用以下代碼在不同時間輸入 y_bar 的值,效果很好。

import numpy as np
from scipy.integrate import odeint
from matplotlib import pyplot as plt
def get_y_bar(t):
    if t>=0 and t<=1:
        return 0.0
    elif t<=2:
        return 1.0
    elif t<=3:
        return 2.0
    elif t<=4:
        return 3.0
    elif t<=5:
        return 4.0
    else:
        return 5.0
def ode(y,t):
    k=0.5
    y_bar=get_y_bar(t)
    dy=k*(y_bar-y)
    return dy
y0=0.0
t0=np.linspace(0,10,100)
sol=odeint(ode,y0,t0)
plt.plot(t0,sol)
plt.show() 

但是,這種方法只有在我有少量數據並且可以手動使用 if.. elif..else 循環輸入時才可行。 如果在較小的時間步長(例如 t= 0.01、0.025、0.03、...、5.0)中有較大的 y_bar 值,我該怎么辦?

我有 CSV 格式的數據並嘗試遍歷數據但卡住了? 有什么簡單的方法可以做到這一點嗎?

def get_y_bar(t):
    data=np.genfromtxt('data.csv',delimiter=',')
    time=data[:,0]
    y_bar=data[:,1]
    for i in range(len(time)):
        if t>=time[i] and t<=time[i=1]:
            return y_bar[i]
        else:

我不確定我是否完全理解你的問題。 但是,如果您想替換get_y_bar中的眾多elif循環,請嘗試以下操作:

import math

def get_y_bar(t):
    return math.floor(t)

math.floor(4.2)將返回4 ,即小於4.2的最大 integer

使用這種方法,您將在每次odeint調用您的ode function 時加載文件,這將非常低效。

解決您的問題的更方便的方法是使用scipy.interpolate.interp1d替換您的get_y_bar function ,而kind = zero ,即constant interpolation 你應該在你的ode function 之外做這個插值,所以你只做一次。

暫無
暫無

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

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