odeint()中的Sympy表达式给出了派生错误

iiqof

我正在尝试使几个过程自动化,例如使用Sympy从Lagrangian生成ODE,并使用Numpy和Scipy对它们进行数值积分。最后的完整代码。作为生成ODE的结果,solve()我得到了一个包含Sympy表达式的字典,如下所示:

{Derivative(lambda1(t), t): (y(t) + 1)/(x(t)*y(t)),
 Derivative(z(t), t): x(t),
 Derivative(x(t), t): y(t)*z(t),
 Derivative(y(t), t): -x(t)*z(t)
 }

然后我想将微分方程组与odeint()Scipy集成在一起为此,我需要lambdify从a内的字典中提取表达式(例如)def Field(Q,t):,以引入as odeint(Field,Q_0,t_array)这是我遇到困难的地方:

我第一次尝试

def Equ2(nQ,t,Q,Field):
x1,y1,z1,lamb1 = nQ
dQ =[]
for f in Q:
    dQ.append(lambdify(Q, Field[f.diff(t)],'numpy' )(x1,y1,z1,lamb1))
return dQ[0:len(nQ)]

但它不能去odeint(),因为它需要的字段2点的参数,我试图把它传递可选arga=()odeint(),给我一个(长)错误:

ValueError                   Traceback (most recent call last)
<ipython-input-20-63f086b8a252> in Equ2(nQ, t, Q, Field)
      20     dQ =[]
      21     for f in Q:
 ---> 22         dQ.append(lambdify(Q, Field[f.diff(t)],'numpy' )(x1,y1,z1,lamb1))
      23     return dQ[0:len(Q)-1]

[...]
ValueError: 
Can't calculate 1st derivative wrt 14.0430379424125.

所以我尝试了基本相同的方法,但是没有循环,

def Equ1(nQ,t):
x1,y1,z1,lamb1 = nQ
dx = lambdify((x,y,z,lam[0]), field[x.diff(t)],'numpy' )(x1,y1,z1,lamb1)
dy = lambdify((x,y,z,lam[0]), field[y.diff(t)],'numpy' )(x1,y1,z1,lamb1)
dz = lambdify((x,y,z,lam[0]), field[z.diff(t)],'numpy' )(x1,y1,z1,lamb1)
dlam = lambdify((x,y,z,lam[0]), field[lam[0].diff(t)],'numpy' )(x1,y1,z1,lamb1)
return [dx,dy,dz]

并有(我认为)相同的问题:

ValueError                                Traceback (most recent call last)
<ipython-input-20-63f086b8a252> in Equ1(nQ, t)
      9 def Equ1(nQ,t):
     10     x1,y1,z1,lamb1 = nQ
---> 11     dx = lambdify((x,y,z,lam[0]), field[x.diff(t)],'numpy' )(x1,y1,z1,lamb1)
     12     dy = lambdify((x,y,z,lam[0]), field[y.diff(t)],'numpy' )(x1,y1,z1,lamb1)
     13     dz = lambdify((x,y,z,lam[0]), field[z.diff(t)],'numpy' )(x1,y1,z1,lamb1)

[...]
ValueError: 
Can't calculate 1st derivative wrt 17.6326726993661.

如果我简单地尝试:

def Equ0(nQ,t):
x,y,z,lamb = nQ
dx = y*z
dy = -x*z
dz = x
dlam = (y+1.)/(x*y)
return [dx,dy,dz]

集成工作正常。同样,如果我EquX()使用带有类似参数函数调用odeint()它们,它们将在内部正常工作。

完整代码

from sympy import *
from sympy.physics.mechanics import dynamicsymbols
from numpy import linspace, sin, cos
from scipy.integrate import odeint

t = Symbol('t')
x = Function('x')(t)
y = Function('y')(t)
z = Function('z')(t)

lam = dynamicsymbols('lambda1:{0}'.format(5))
f = x.diff(t)- y*z
eq = Matrix([x.diff(t) - lam[0].diff(t)*y*x*z+z,
         y.diff(t) +x*z,
         z.diff(t)-x
        ])

field = solve(list(eq)+[f],[x.diff(t),y.diff(t),z.diff(t),lam[0].diff(t)])


def Equ0(nQ,t):
    x,y,z,lamb = nQ
    dx = y*z
    dy = -x*z
    dz = x
    dlam = (y+1.)/(x*y)
    return [dx,dy,dz]

def Equ1(nQ,t):
    x1,y1,z1,lamb1 = nQ
    dx = lambdify((x,y,z,lam[0]), field[x.diff(t)],'numpy' )(x1,y1,z1,lamb1)
    dy = lambdify((x,y,z,lam[0]), field[y.diff(t)],'numpy' )(x1,y1,z1,lamb1)
    dz = lambdify((x,y,z,lam[0]), field[z.diff(t)],'numpy' )(x1,y1,z1,lamb1)
    dlam = lambdify((x,y,z,lam[0]), field[lam[0].diff(t)],'numpy' )(x1,y1,z1,lamb1)
    return [dx,dy,dz]


def Equ2(nQ,t,Q,Field):
    x1,y1,z1,lamb1 = nQ
    dQ =[]
    for f in Q:
        dQ.append(lambdify(Q, Field[f.diff(t)],'numpy' )(x1,y1,z1,lamb1))
    return dQ[0:len(Q)-1]

q = [x,y,z,lam[0]]
nq = [1,2,3,4]
time=linspace(0,10,10)

### This line works just fine:
print Equ0(nq,t), Equ1(nq,t), Equ2(nq,t,q,field) #They give the same output 

sol0 = odeint(Equ0,nq,time)
sol1 = odeint(Equ1,nq,time) #Errors here
sol2 = odeint(Equ2,nq,time,args=(q,field)) #And here

最后是完整错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 <ipython-input-20-63f086b8a252> in Equ1(nQ, t)
  9 def Equ1(nQ,t):
 10     x1,y1,z1,lamb1 = nQ
 ---> 11     dx = lambdify((x,y,z,lam[0]), field[x.diff(t)],'numpy' )(x1,y1,z1,lamb1)
 12     dy = lambdify((x,y,z,lam[0]), field[y.diff(t)],'numpy' )(x1,y1,z1,lamb1)
 13     dz = lambdify((x,y,z,lam[0]), field[z.diff(t)],'numpy' )(x1,y1,z1,lamb1)

/usr/local/lib/python2.7/dist-packages/sympy/core/expr.pyc in diff(self, *symbols, **assumptions)
2864         new_symbols = list(map(sympify, symbols))  # e.g. x, 2, y, z---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-63f086b8a252> in Equ1(nQ, t)
  9 def Equ1(nQ,t):
 10     x1,y1,z1,lamb1 = nQ
 ---> 11     dx = lambdify((x,y,z,lam[0]), field[x.diff(t)],'numpy' )(x1,y1,z1,lamb1)
 12     dy = lambdify((x,y,z,lam[0]), field[y.diff(t)],'numpy' )(x1,y1,z1,lamb1)
 13     dz = lambdify((x,y,z,lam[0]), field[z.diff(t)],'numpy' )(x1,y1,z1,lamb1)

  /usr/local/lib/python2.7/dist-packages/sympy/core/expr.pyc in diff(self, *symbols, **assumptions)
  2864         new_symbols = list(map(sympify, symbols))  # e.g. x, 2, y, z
2865         assumptions.setdefault("evaluate", True)
---> 2866         return Derivative(self, *new_symbols, **assumptions)
2867 
2868     ###########################################################################

/usr/local/lib/python2.7/dist-packages/sympy/core/function.pyc in __new__(cls, expr, *variables, **assumptions)
1068                 ordinal = 'st' if last_digit == 1 else 'nd' if last_digit == 2 else 'rd' if last_digit == 3 else 'th'
1069                 raise ValueError(filldedent('''
---> 1070                 Can\'t calculate %s%s derivative wrt %s.''' % (count, ordinal, v)))
1071 
1072             if all_zero and not count == 0:

ValueError: 
Can't calculate 1st derivative wrt 0.0.

2865         assumptions.setdefault("evaluate", True)
---> 2866         return Derivative(self, *new_symbols, **assumptions)
2867 
2868     ###########################################################################

/usr/local/lib/python2.7/dist-packages/sympy/core/function.pyc in __new__(cls, expr, *variables, **assumptions)
1068                 ordinal = 'st' if last_digit == 1 else 'nd' if last_digit == 2 else 'rd' if last_digit == 3 else 'th'
1069                 raise ValueError(filldedent('''
---> 1070                 Can\'t calculate %s%s derivative wrt %s.''' % (count, ordinal, v)))
1071 
1072             if all_zero and not count == 0:

ValueError: 
Can't calculate 1st derivative wrt 0.0.

TL; DR某些导出错误出现在odeint()内部,我无法使用定制函数在odeint()外部重现。

鲁兹·莱曼(Lutz Lehmann)

如果要t用作符号,则应避免t在函数声明中声明为浮点数。尝试用t其他名称替换浮点s或者tt或者...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Eclipse对JSF文件中的EL表达式给出了太多的错误错误和警告

来自分类Dev

“表达式”为“表达式”错误后,指南针给出了无效的CSS

来自分类Dev

角度的正则表达式给出了无与伦比的括号错误

来自分类Dev

派生列表达式不起作用,但没有给出错误

来自分类Dev

SQLite查询中的正则表达式给出了无法识别的令牌异常

来自分类Dev

正则表达式给出了很多数字

来自分类Dev

在sympy中智能重写表达式

来自分类Dev

在sympy中运行表达式的AST

来自分类Dev

解决 sympy 中的表达式列表

来自分类Dev

在python中给出表达式

来自分类Dev

正则表达式在WSO2中无法正常工作,但是在Java正则表达式测试器上给出了正确的响应

来自分类Dev

奇怪的“符号布尔表达式没有真值”错误-这是SymPy中的错误吗?

来自分类Dev

SSIS中拆分组件中的表达式给出错误

来自分类Dev

来自ngFor项的动态routerLink值,给出错误“预期表达式中的插值({{}})”

来自分类Dev

URL验证正则表达式在打字稿中给出错误

来自分类Dev

指向函数中向量的向量的指针给出“表达式必须具有指针类型”错误

来自分类Dev

为什么使用“ constexpr”在代码块中给出主表达式错误

来自分类Dev

JavaScript中的正则表达式给出未捕获的类型错误

来自分类Dev

lambdified sympy表达式返回错误结果

来自分类Dev

Python中的正则表达式出了点问题

来自分类Dev

ule子选择表达式给出流关闭错误

来自分类Dev

正则表达式给出错误的结果

来自分类Dev

LINQ 表达式:Nreco 框架给出编译错误

来自分类Dev

bash正则表达式:星号使用grep给出了模糊的搜索结果

来自分类Dev

为什么给出错误表达式不能包含lambda表达式?

来自分类Dev

如何获得sympy表达式中的符号列表?

来自分类Dev

Sympy:逻辑表达式中的C代码

来自分类Dev

在Sympy中收集类似表达式的术语

来自分类Dev

在sympy中,使用规范的换向关系简化表达式

Related 相关文章

  1. 1

    Eclipse对JSF文件中的EL表达式给出了太多的错误错误和警告

  2. 2

    “表达式”为“表达式”错误后,指南针给出了无效的CSS

  3. 3

    角度的正则表达式给出了无与伦比的括号错误

  4. 4

    派生列表达式不起作用,但没有给出错误

  5. 5

    SQLite查询中的正则表达式给出了无法识别的令牌异常

  6. 6

    正则表达式给出了很多数字

  7. 7

    在sympy中智能重写表达式

  8. 8

    在sympy中运行表达式的AST

  9. 9

    解决 sympy 中的表达式列表

  10. 10

    在python中给出表达式

  11. 11

    正则表达式在WSO2中无法正常工作,但是在Java正则表达式测试器上给出了正确的响应

  12. 12

    奇怪的“符号布尔表达式没有真值”错误-这是SymPy中的错误吗?

  13. 13

    SSIS中拆分组件中的表达式给出错误

  14. 14

    来自ngFor项的动态routerLink值,给出错误“预期表达式中的插值({{}})”

  15. 15

    URL验证正则表达式在打字稿中给出错误

  16. 16

    指向函数中向量的向量的指针给出“表达式必须具有指针类型”错误

  17. 17

    为什么使用“ constexpr”在代码块中给出主表达式错误

  18. 18

    JavaScript中的正则表达式给出未捕获的类型错误

  19. 19

    lambdified sympy表达式返回错误结果

  20. 20

    Python中的正则表达式出了点问题

  21. 21

    ule子选择表达式给出流关闭错误

  22. 22

    正则表达式给出错误的结果

  23. 23

    LINQ 表达式:Nreco 框架给出编译错误

  24. 24

    bash正则表达式:星号使用grep给出了模糊的搜索结果

  25. 25

    为什么给出错误表达式不能包含lambda表达式?

  26. 26

    如何获得sympy表达式中的符号列表?

  27. 27

    Sympy:逻辑表达式中的C代码

  28. 28

    在Sympy中收集类似表达式的术语

  29. 29

    在sympy中,使用规范的换向关系简化表达式

热门标签

归档