【问题标题】:How to fix / work-around NotImplemented error in sympy dsolve function?如何修复/解决 sympy dsolve 函数中的 NotImplemented 错误?
【发布时间】:2019-04-04 12:45:34
【问题描述】:

我尝试在 sympy 中求解一个由 4 个微分方程组成的系统。我得到一个“NotImplementedError”。有解决办法吗?

我要解决的一组 ode 是:

![ODE]:https://imgur.com/Xa5fwlt

我尝试用数值代替 R12 到 R45 符号。我继续收到同样的错误。

import sympy as sp
import numpy as np
import matplotlib.pyplot as plt

# Define symbols

m1, m2, m3, m4 = sp.symbols('m1 m2 m3 m4', real = True, positive=True)
c1, c2, c3, c4 = sp.symbols('c1 c2 c3 c4', real = True, positive=True)
R12, R25, R23, R34, R45 = sp.symbols('R12 R25 R23 R34 R45', real = True, positive=True) #0.2, 0.1, 2.7, 0.5, .6 
T1, T2, T3, T4 = sp.symbols('T1 T2 T3 T4', cls=sp.Function)
qp, qel = sp.symbols('qp qel')

T5 = 25 # ambient temperature

# Define equations
eq1 = -sp.Eq(sp.Derivative(T1(t), t)) + - (T1(t)-T2(t)) / (R12 * m1 * c1)
eq2 = -sp.Eq(sp.Derivative(T2(t), t)) + 1 / (m2 * c2) * ((T1(t) - T2(t))/R12 + (T5-T2(t))/R25 - (T2(t)-T3(t))/R23)
eq3 = -sp.Eq(sp.Derivative(T3(t), t)) + 1 / (m3 * c3) * ((T2(t) - T3(t))/R23 + (T4(t)-T3(t))/R34 - qp)
eq4 = -sp.Eq(sp.Derivative(T4(t), t)) + 1 / (m4 * c4) * (qp - (T4(t) - T3(t))/R34 + (T4(t)-T5)/R45)

eq = (eq1, eq2, eq3, eq4)
funct = (T1(t), T2(t), T3(t), T4(t))  

# Solve

sp.dsolve(eq, funct)

我希望得到这组微分方程的符号解。 结果是“NotImplementedError”

【问题讨论】:

    标签: python numpy sympy


    【解决方案1】:

    您创建方程式的语法不正确。 Eq 需要接受两个参数,左侧和右侧。

    eq1 = sp.Eq(sp.Derivative(T1(t), t), + - (T1(t)-T2(t)) / (R12 * m1 * c1))
    eq2 = sp.Eq(sp.Derivative(T2(t), t), + 1 / (m2 * c2) * ((T1(t) - T2(t))/R12 + (T5-T2(t))/R25 - (T2(t)-T3(t))/R23))
    eq3 = sp.Eq(sp.Derivative(T3(t), t), + 1 / (m3 * c3) * ((T2(t) - T3(t))/R23 + (T4(t)-T3(t))/R34 - qp))
    eq4 = sp.Eq(sp.Derivative(T4(t), t), + 1 / (m4 * c4) * (qp - (T4(t) - T3(t))/R34 + (T4(t)-T5)/R45))
    

    我这样做了,dsolve 需要一段时间来计算解决方案。它必须对一个 4x4 符号矩阵求幂,这涉及找到符号特征值,即求解一个四次方程,即very complicated in the general case

    SymPy 可能会在这里得到改进。用数字替换符号参数应该会使其运行得更快。

    【讨论】:

    • 非常感谢。你能告诉我将参数(eq 和函数)传递给 dsolve 的语法吗?当我尝试eq = [eq1, eq2, eq3, eq4] funct = [T1(t), T2(t), T3(t), T4(t)] sp.dsolve(eq, funct) ` 会导致错误'Tuple' object has no attribute 'expand'。我试图通过funct = [T1, T2, T3, T4] 导致'property' 类型的对象没有len()。我对 sympy 的语法越来越困惑。它适用于列表、元组……吗?
    • T1(t) 等等都是正确的。对于另一个错误,您可能不小心在某处创建了一个元组。检查type(eq1)等是否为Equality,以及eq1.lhseq1.rhs的类型为DerivativeAddMul
    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多