【问题标题】:Passing large time dependent data to solve differential equation in python,传递大量时间相关数据来求解python中的微分方程,
【发布时间】:2020-04-27 09:21:21
【问题描述】:

考虑这个简单的一阶微分方程:

其中 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:

【问题讨论】:

    标签: python pandas numpy scipy numerical-methods


    【解决方案1】:

    使用这种方法,您将在每次 odeint 调用您的 ode 函数时加载您的文件,这将非常低效。

    解决问题的更方便的方法是使用 scipy.interpolate.interp1d 替换 get_y_bar 函数,改为 kind = zero,即常量插值。您应该在 ode 函数之外执行此插值,因此您只需执行一次。

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解您的问题。但如果你想替换get_y_bar 中的众多elif 循环,试试这个:

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

      math.floor(4.2)会返回4,这是小于4.2的最大整数

      【讨论】:

        猜你喜欢
        • 2017-11-18
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2012-01-31
        • 2021-05-27
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        相关资源
        最近更新 更多