标签: sympy

在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
查看次数

如何用scipy/numpy或sympy进行非线性优化?

我试图找到Python中以下方程组的最优解:

(x-x1)^2 + (y-y1)^2 - r1^2 = 0
(x-x2)^2 + (y-y2)^2 - r2^2 = 0
(x-x3)^2 + (y-y3)^2 - r3^2 = 0
Run Code Online (Sandbox Code Playgroud)

给定点(x,y)和半径(r)的值:

x1, y1, r1 = (0, 0, 0.88)
x2, y2, r2 = (2, 0, 1)
x3, y3, r3 = (0, 2, 0.75)
Run Code Online (Sandbox Code Playgroud)

找到点(x,y)的最优解的最佳方法是使用上面的例子:
〜(1,1)

python numpy sympy scipy

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

如何让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中相对于其他变量的变量的假设

我知道python中的同情可以设置变量的假设,例如x是正数,负数,实数,复数等.我想知道sympy是否可以设置变量相对于其他变量的假设.例如,如果我有变量x和y,我可以设置sympy以假设其解决方案中的x> y.或者,如果我有两个变量a和B,我可以设置同情假设a + 2B <1?这些假设可能有助于简化解决()和特征向量的复杂解决方案.

我看了一遍,并没有找到有关在同情中设置这些假设的信息.

我问,因为我试图找到特定矩阵的特征向量

a,b = symbols('a,b', nonnegative=False)
M = Matrix([ [1-a-2*b, a, b, b], 
             [a, 1-a-2*b, b, b],
             [b, b, 1-a-2*b, a],
             [b, b, a, 1-a-2*b] ])
Run Code Online (Sandbox Code Playgroud)

Sympy正确地找到了特征值

M.eigenvals()
Run Code Online (Sandbox Code Playgroud)

我通过MATLAB和WolframAlpha证实了这一点,它们都给出了相同的结果.然而,特征向量是一团糟

M.eigenvects()
Run Code Online (Sandbox Code Playgroud)

MATLAB和WolframAlpha都返回[1,1,1,1] [-1,-1,1,1] [0,0,-1,1] [-1,1,0,0]的特征向量,它们是正确的特征向量.我甚至都没有试图简化同意的结果,因为它们非常漫长而复杂.我怀疑它与变量的假设有关,比如指定a + 2b <1,但我不确定.

python math sympy

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

Python Sympy矩阵的漂亮输出

Matrix([[607000, 907, 259, -2165, -1846, 185, -60, -1593, 1445, 1405], [-1000, -2, 0, -1, 0, 0, -1, 0, 0, -1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [-4000, -7, -3, 5, 4, 1, -1, 4, -4, -2], [-317000, -469, -128, 1173, 1001, -105, 35, 862, -772, -771], [-70000, -105, -32, 246, 209, -19, 7, 180, -166, -157], [8000, 14, 6, -10, -9, -1, -1, -8, 9, 4], [-540000, -807, -230, 1925, 1642, -166, 56, 1418, -1284, -1249], …
Run Code Online (Sandbox Code Playgroud)

python sympy python-2.7

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

如何序列化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:'Transpose'对象没有属性tolist

我试图用sympy做一些符号矩阵计算.我的目标是获得一些矩阵计算结果的符号表示.我遇到了一些问题,我已经将这个问题归结为这个简单的例子,其中我尝试评估指数矩阵的取幂结果并将其乘以任意向量.

>>> import sympy
>>> v = sympy.MatrixSymbol('v', 2, 1)
>>> Z = sympy.zeros(2, 2)  # create 2x2 zero matrix
>>> I = sympy.exp(Z)  # exponentiate zero matrix to get identity matrix
>>> I * v
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sympy/matrices/matrices.py", line 507, in __mul__
    blst = B.T.tolist()
AttributeError: 'Transpose' object has no attribute 'tolist'
Run Code Online (Sandbox Code Playgroud)

相反,如果我直接创建单位矩阵然后乘以v,那么就没有问题:

>>> I_ = sympy.eye(2)  # directly create the identity matrix
>>> I_ == I  # check …
Run Code Online (Sandbox Code Playgroud)

python matrix symbolic-math sympy

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

如何在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
查看次数