【问题标题】:Writing functions from dictionaries to be used with solve_ivp从字典中编写函数以与solve_ivp一起使用
【发布时间】:2020-07-19 23:54:51
【问题描述】:

我正在尝试使用solve_ivp 求解一个大型微分方程组。

from scipy import integrate

def dXdt(X,t):
    return np.array([dadt(X,t), dbdt(X,t), dcdt(X,t), dddt(X,t])

sol = integrate.solve_ivp(dXdt, (0,100), initial_value_array, t_eval)

dadt(X,t)dbdt(X,t)dcdt(X,t)dddt(X,t] 是我需要从以下字典中获取的微分方程组:

da_dict = {'a': -1.0, 'b': 2.0, 'c': 4.0}
db_dict = {'b': -10.0, 'a': 1.0}
dc_dict = {'c': -4.0, 'b': 3.0}
dd_dict = {'b': 5.0}

如下:

def dadt(X,t):
    return -1.0*X[0] + 2*X[1] + 3*X[2]

其中,X[0]X[1]X[2]x[3] 在字典中由 'a''b''c''d' 表示。同样,

def dbdt(X,t):
    return -10*X[1] + 1*X[0]

def dcdt(X,t):
    return -4*X[2] + 3*X[1]

def dddt(X,t):
    return 5*X[1]

我有 100 多个微分方程需要使用 solve_ivp 求解。我如何从字典中写dadt(X,t)dbdt(X,t)....而不实际写它们?

【问题讨论】:

  • 是的,要与solve_ivp一起使用,X需要是一个数组。
  • 到底是什么问题?你有没有尝试过,做过任何研究?见How to Askhelp center
  • 大系统总是线性的吗?然后,使用矩阵指数作为精确解决方案的实现,您可能会获得更好的结果。我不确定是否有稀疏变体。
  • @LutzLehmann,它不是。该系统是一阶和二阶微分方程的组合。
  • python 源代码中的表达式是否编码为字典?然后,您可以用同样的努力将它们编码为 sympy 表达式,并应用 autowrap 或 ufuncify 等代码生成工具来生成 ODE 函数。或者使用更自动的 jitcode。

标签: python function differential-equations odeint


【解决方案1】:

我不确定如何处理 t 参数,因为您没有在任何示例中使用它。我将 X 和 t 的占位符值放在下面的代码中

我在下面写了一个可能对您的示例有用的 sn-p。我把你的字典放在一个列表中,如果你已经写了所有的,你可以自己添加其他的

da_dict = {'a': -1.0, 'b': 2.0, 'c': 4.0}
db_dict = {'b': -10.0, 'a': 1.0}
dc_dict = {'c': -4.0, 'b': 3.0}
dd_dict = {'b': 5.0}

# associate the order of the coefficient letter to a position in the array.
order = {
    "a": 0,
    "b": 1,
    "c": 2,
    "d": 3,
    "e": 4
}

def equation_maker(X,t,equation):

    output_eq = 0
    # coeff: a,b,.. coeff_value: -1.0, 2.0,...
    for coeff,coeff_value in equation.items():
        output_eq += X[order.get(coeff)]*coeff_value
    return output_eq


equation_list = [da_dict,db_dict,dc_dict,dd_dict]
# output list of equations that you can convert to numpy arrays or whatever
diff_eq_list = []
# placeholder values for X and t
X = [0,1,2,3,4]
t = 0
for equation in equation_list:
    # assuming you have X and t from somewhere else
    diff_eq_list.append(equation_maker(X,t,equation))

print(diff_eq_list)

我从未使用过 scipy(还没有!),但我希望这可以帮助您不必编写所有函数,如果这对您有用,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2018-03-30
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多