标签: sympy

SymPy无法解决Matlab可以解决的等式

我有一个与轨道力学中的太阳同步共振条件有关的方程.我目前正在学习Python,所以我尝试使用以下代码在SymPy中解决它:

from sympy import symbols,solve

[n_,Re_,p_,i_,J2_,Pe_] = symbols(['n_','Re_','p_','i_','J2_','Pe_'])

del_ss = -((3*n_*(Re_**2)*J2_/(4*(p_**2)))*(4-5*(sin(i_)**2)))-((3*n_*(Re_**2)*J2_/(2*(p_**2)))*cos(i_))-((2*pi)/Pe_)

pprint(solve(del_ss,i_))
Run Code Online (Sandbox Code Playgroud)

可以为五个变量成功重新排列表达式,但是当i_solve命令中使用变量时(如上所述),会产生错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 479, in runfile
    execfile(filename, namespace)
  File "C:\Users\Nathan\Python\sympy_test_1.py", line 22, in <module>
    pprint(solve(del_ss,i_))
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 484, in solve
    solution = _solve(f, *symbols, **flags)
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 700, in _solve
    soln = tsolve(f_num, symbol)
  File "C:\Python27\lib\site-packages\sympy\solvers\solvers.py", line 1143, in tsolve
    "(tsolve: at least one Function expected at this point")
NotImplementedError: …
Run Code Online (Sandbox Code Playgroud)

python sympy

9
推荐指数
1
解决办法
1638
查看次数

SymPy:将符号/变量限制为间隔

使用SymPy,是否可以将符号/变量的可能值限制在一定范围内?我现在可以在定义符号时设置一些属性,比如positive=True,但是我需要更多的控制,即我需要将它设置为区间[0,1].然后应该使用这个假设来解决,简化等.

range solver sympy intervals

9
推荐指数
2
解决办法
5250
查看次数

Sympy类Zero,One和NegativeOne,为什么它们存在?

今天我发现了这个

>>> type(1)
<class 'sympy.core.numbers.One'>
>>> type(0)
<class 'sympy.core.numbers.Zero'>
>>> type(-1)
<class 'sympy.core.numbers.NegativeOne'>
>>> type(2)
<class 'sympy.core.numbers.Integer'>
Run Code Online (Sandbox Code Playgroud)

从同意这些类型的文档中查看了文档,但它没有说明它们存在的原因.是否有理由为-1,0和1设置3个特殊单例类?

编辑:我在SymPy在线shell看到了这个

python sympy

9
推荐指数
1
解决办法
270
查看次数

使用SymPy codegen为方程组生成Fortran子例程

基于我在这里找到的前一个例子,我试图找出如何生成一个Fortran代码,该代码对应于我需要坚持的特定形式.所需的FORTRAN代码将如下所示(它基于FitzHugh-Nagumo模型):

  SUBROUTINE FF(NE,U,PAR,F) 
!     ---------- -- 
!     Define the nonlinear term

  IMPLICIT NONE
  INTEGER, INTENT(IN) :: NE
  DOUBLE PRECISION, INTENT(IN) :: U(NE),PAR(*)
  DOUBLE PRECISION, INTENT(OUT) :: F(NE)

  DOUBLE PRECISION u,v,e,a1,a0

    u=U(1)
    v=U(2)
    e=PAR(1)
    a1=PAR(2)
    a0=PAR(3)

    F(1)= u-u**3-v 
    F(2)= e*(u-a1*v-a0)

  END SUBROUTINE FF
Run Code Online (Sandbox Code Playgroud)

我设法在SymPy中创建正确的表达式,但我还没弄清楚如何生成所需的代码codegen.这是我到目前为止的尝试:

from sympy import symbols,latex
from sympy.utilities.codegen import codegen
from sympy.tensor import IndexedBase, Idx
from sympy import Matrix
U, PAR = symbols('U PAR', cls=IndexedBase)

u = U[1]
v = U[2]

e = …
Run Code Online (Sandbox Code Playgroud)

python code-generation sympy python-2.7 codegen

9
推荐指数
1
解决办法
248
查看次数

在Python中测试数学表达式的等价性

我在Python中有两个字符串,

A m * B s / (A m + C m)
Run Code Online (Sandbox Code Playgroud)

C m * B s / (C m + A m)
Run Code Online (Sandbox Code Playgroud)

它们都是无序集(A,C)和无序集(B)的等价函数.m和s表示可以在相同但不与另一个单元交换的单位.

到目前为止,我正在进行A,B和C的排列,并使用eval和SymPy的==运算符对它们进行测试.这有许多缺点:

  • 对于更复杂的表达式,我必须生成大量的排列(在我的例子中,8个嵌套for循环)
  • 我需要将A,B,C定义为符号,当我不知道我将拥有哪些参数时,这不是最佳的(因此我必须生成所有这些参数 - >非常低效并且弄乱我的变量名称空间)

有没有pythonian方法来测试这种等价?它应该是一个任意的表达式.

python equality sympy mathematical-expressions

8
推荐指数
1
解决办法
1938
查看次数

如何让numpy.einsum与sympy一起玩?

好的,所以我有几个多维的numpy数组的sympy对象(表达式).例如:

A = array([[1.0*cos(z0)**2 + 1.0, 1.0*cos(z0)],
          [1.0*cos(z0), 1.00000000000000]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

等等.

我想要做的是使用einsum将这些数组中的几个相乘,因为我已经通过我之前做过的数值计算得到了它的语法.问题是,当我尝试做类似的事情时

einsum('ik,jkim,j', A, B, C)
Run Code Online (Sandbox Code Playgroud)

我收到类型错误:

TypeError: invalid data type for einsum
Run Code Online (Sandbox Code Playgroud)

当然,所以在谷歌上快速搜索显示我可能无法做到这一点,但没有理由为什么.特别是,在这些数组上调用numpy.dot()和numpy.tensordot()函数就像一个魅力.我可以使用tensordot来做我需要的事情,但是当我考虑用嵌套的tensordot调用替换上面的那些(如下的顺序非常重要)的50个左右的Einsten总结时,我的大脑会受到伤害.更糟糕的是,虽然必须调试该代码并寻找那个错位的索引交换.

长话短说,有谁知道为什么tensordot与物体一起工作但是einsum不会?有关解决方法的任何建议吗?如果没有,关于我如何编写自己的包装器到嵌套的tensordot调用的任何建议有点类似于einsum符号(数字而不是字母都可以)?

python nested numpy sympy

8
推荐指数
2
解决办法
854
查看次数

如何序列化sympy lambdified函数?

标题说明了一切.有没有办法序列化sympy.lambdify生成的函数?:

import sympy as sym
import pickle
import dill
a, b = sym.symbols("a, b")
expr = sym.sin(a) + sym.cos(b)
lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
pickle.dumps(lambdified_expr) # won't work
dill.dumps(lambdified_expr) # won't work either
Run Code Online (Sandbox Code Playgroud)

...我想这样做的原因是因为我的代码生成了很多lambdified函数,但我发现它每次都需要很长时间.

python serialization numpy pickle sympy

8
推荐指数
1
解决办法
1182
查看次数

如何在sympy + IPython中禁用init_printing

好的,我知道如何init_printing使用MathJax自动呈现IPython输出.

from sympy import init_printing
init_printing() 
Run Code Online (Sandbox Code Playgroud)

我怎么让它停下来?(是的,我可以重置我的笔记本电脑,但我想把它打开只是为了几个单元格并再次关闭它.)

python sympy ipython

8
推荐指数
1
解决办法
1104
查看次数

将涉及矢量转置的表达式转换为具有lambdify的数值函数

我在python中编写了一个脚本,它使用sympy来计算几个向量/矩阵公式.但是,当我尝试将这些函数转换为我可以使用sympy.lambdify进行评估的函数时,我得到了一个

SyntaxError:扫描字符串文字时的EOL

这里有一些代码有相同的错误,所以你可以看到我的意思.

import sympy
x = sympy.MatrixSymbol('x',3,1)
f = sympy.lambdify(x, x.T*x)
Run Code Online (Sandbox Code Playgroud)

因此,语法错误与表达式"x'.dot(x)"和".T"到'的转换有关.

我如何解决这个问题,从上面的lambdify中正确定义f?

python vector sympy

8
推荐指数
1
解决办法
231
查看次数

如何找到SymPy给出一阶导数的n阶导数?

鉴于一些˚F和微分方程X "()= ˚F(X()),我如何计算X (Ñ)(而言)X()?

例如,给定f(x(t))= sin(x(t)),我想得到x (3)(t)=(cos(x(t))2 - sin(x(t))2)sin(x(t)).

到目前为止我已经尝试过了

>>> from sympy import diff, sin
>>> from sympy.abc import x, t
>>> diff(sin(x(t)), t, 2)
Run Code Online (Sandbox Code Playgroud)

这给了我

-sin(x(t))*Derivative(x(t), t)**2 + cos(x(t))*Derivative(x(t), …
Run Code Online (Sandbox Code Playgroud)

python sympy differential-equations

8
推荐指数
1
解决办法
1169
查看次数