我在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的==运算符对它们进行测试.这有许多缺点:
有没有pythonian方法来测试这种等价?它应该是一个任意的表达式.
我试图找到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)
好的,所以我有几个多维的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中的同情可以设置变量的假设,例如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,但我不确定.
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) 标题说明了一切.有没有办法序列化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函数,但我发现它每次都需要很长时间.
我试图用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) 好的,我知道如何init_printing使用MathJax自动呈现IPython输出.
from sympy import init_printing
init_printing()
Run Code Online (Sandbox Code Playgroud)
我怎么让它停下来?(是的,我可以重置我的笔记本电脑,但我想把它打开只是为了几个单元格并再次关闭它.)
我在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?
鉴于一些˚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)