如何修改此微分方程解算器以求解大量变量?

2024-10-01 09:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想修改下面的代码,以便它可以解决成千上万的变量与成千上万的夫妇微分方程。问题是我希望能够导入变量列表(y),理想情况下是作为numpy数组导入,但可以接受作为常规列表导入。这个列表会很庞大,所以我不想在函数中定义它。如果我做了像define a='n','c1',。。。然后设置a=y,python抱怨变量的类型不对。如果我定义a=n,c1,….python会抱怨我没有定义变量。如果您对如何将这个函数的非常大的变量列表作为列表或numpy数组导入有任何建议,那就太好了。你知道吗

import numpy as np
from scipy.integrate import odeint


def kinetics(y,t,b1,b2):
    n,c1=y
    dydt=[(b1*n)+(b2*c1),(b1*n)-(c1)]
    return dydt

b1=0.00662888
b2=0.000239997

n0=1
c1_0=1

y0=[n0,c1_0]
t = np.linspace(0, 10, 10)
sol = odeint(kinetics, y0, t, args=(b1,b2))

print(sol)

Tags: 函数importnumpy列表定义np数组b2
1条回答
网友
1楼 · 发布于 2024-10-01 09:30:20

对于每一步,这种重命名和使用单个python对象的方式可能会很慢,特别是当您可以对部分计算使用numpy数组向量化时。请注意,您当前的代码可以重新格式化为一个线性代数问题,使用numpy可以非常有效地解决这个问题,假设对ODE结构的其余部分都是这样。我警告你不要走你想走的路。你知道吗

但是,假设没有任何东西可以用这种方式矢量化,并且您希望继续沿着这条路径,您可以定义一个类来存储所有数据,并在每次函数调用时创建一个当前状态为y的类实例。如果需要,可以将类定义存储在单独的python模块中,以保持问题定义的整洁。你知道吗

如果使用python 3:

import numpy as np
from scipy.integrate import odeint


class vars:
    def __init__(self, *args):
        (self.n, self.c1) = args

def kinetics(y,t,b1,b2):
    v = vars(*y)
    dydt=[
        (b1 * v.n) + (b2 * v.c1),
        (b1 * v.n) - (v.c1)
    ]
    return dydt

b1=0.00662888
b2=0.000239997

n0=1
c1_0=1

y0=[n0,c1_0]
t = np.linspace(0, 10, 10)
sol = odeint(kinetics, y0, t, args=(b1,b2))

print(sol)

相关问题 更多 >