标签: sympy

用sympy.physics.quantum简化量子表达

与python同情:

from sympy import sqrt
from sympy.physics.quantum import Bra,Ket,qapply
superpos = (Ket('Dead')+Ket('Alive'))/sqrt(2)
d = qapply(Bra('Dead')*superpos)
Run Code Online (Sandbox Code Playgroud)

它给:

sqrt(2)*<Dead|Alive>/2 + sqrt(2)*<Dead|Dead>/2
Run Code Online (Sandbox Code Playgroud)

如何将'Dead'和'Alive'设置为正交状态,以便d.doit()给出:

sqrt(2)/2
Run Code Online (Sandbox Code Playgroud)

(我只能这样做:

d.subs(Bra('Dead')*Ket('Dead'),1).subs(Bra('Dead')*Ket('Alive'),0)
Run Code Online (Sandbox Code Playgroud)

但我相信有更好的方法)

python sympy states orthogonal

13
推荐指数
1
解决办法
514
查看次数

处理由sympy整合返回的分段方程式

同情我有一个积分返回一个Piecewise对象,例如

In [2]: from sympy.abc import x,y,z

In [3]: test = exp(-x**2/z**2)

In [4]: itest = integrate(test,(x,0,oo))

In [5]: itest
Out[5]: 
?   ___                                                   
? ?? ? ?z       ?                 ?      1          ??   ?
? ???????   for ?periodic_argument???????????????, ??? ? ?
?    2          ?                 ?          2      ??   2
?               ?                 ?polar_lift (z)   ??    
?                                                         
??                                                        
??                                                        
??    2                                                   
??  -x                                                    
??  ???                                                   
??    2                                                   
??   z                                                    
?? ?    dx                    otherwise                   
??                                                        
?0                                                        
?    
Run Code Online (Sandbox Code Playgroud)

我想提取这个分段方程的第一个分支,换句话说,我希望能够做一些itest.parts(0)简单的提取sqrt(pi)*z/2.我似乎无法找到任何方法来做到这一点,但也许我在文档中使用了错误的搜索词.有任何想法吗?

编辑

稍微探讨一下,我已经设法发现,如果我这样做,itest.args[0][0]我可以提取这个表达式.然而,这看起来有点像黑客.有更好的方法吗?

python symbolic-math sympy computer-algebra-systems symbolic-computation

12
推荐指数
1
解决办法
2894
查看次数

将sympy表达式转换为numpy数组的函数

我有一个同意写的ODE系统:

from sympy.parsing.sympy_parser import parse_expr

xs = symbols('x1 x2')
ks = symbols('k1 k2')
strs = ['-k1 * x1**2 + k2 * x2', 'k1 * x1**2 - k2 * x2']
syms = [parse_expr(item) for item in strs]
Run Code Online (Sandbox Code Playgroud)

我想这转换成向量量值函数,接受的x值,第k值的1D numpy的阵列的一维阵列numpy的,返回在那些点评估的方程的一个一维阵列numpy的.签名看起来像这样:

import numpy as np
x = np.array([3.5, 1.5])
k = np.array([4, 2])
xdot = my_odes(x, k)
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西的原因是给这个功能scipy.integrate.odeint,所以它需要快.

尝试1:潜艇

当然,我可以写一个包装器subs:

def my_odes(x, k):
    all_dict = dict(zip(xs, x))
    all_dict.update(dict(zip(ks, k)))
    return np.array([sym.subs(all_dict) for sym in syms])
Run Code Online (Sandbox Code Playgroud)

但这是超级慢的,特别是对于我的真实系统,它更大,并且运行了很多次.我需要将此操作编译为C代码.

尝试2:theano

我可以通过sympy …

python numpy sympy scipy

12
推荐指数
1
解决办法
3603
查看次数

如何简化SymPy中的矩阵表达式?

请考虑以下示例

import sympy as sy
n = sy.symbols('n')
A = sy.MatrixSymbol("A",n,n)
B = sy.MatrixSymbol("B",n,n)
C = sy.MatrixSymbol("C",n,n)
M = A.inverse()*B.inverse() - A.inverse()*C*B.inverse()
B.inverse()*M.inverse()*A.inverse()
Run Code Online (Sandbox Code Playgroud)

打印出来的例子B^-1*(A^-1*B^-1 - A^-1*C*B^-1)^-1*A^-1.

SymPy可以简化表达式(I-C)^-1吗?如果没有,那么任何中间结果如何收集共同因素M

python symbolic-math sympy

12
推荐指数
1
解决办法
307
查看次数

Python中的单位转换

SymPy是在Python中进行单位转换的绝佳工具:

>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000
Run Code Online (Sandbox Code Playgroud)

你可以轻松自己动手:

>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2
Run Code Online (Sandbox Code Playgroud)

但是,我无法将此实现到我的应用程序中,除非我可以将度C(绝对值)转换为K到度数F到度数R或其任何组合.

我想也许这样的事情会起作用:

units.degC = <<somefunc of units.K>>
Run Code Online (Sandbox Code Playgroud)

但显然这是走错路.在SymPy中干净地实现"偏移"型单位转换的任何建议?

注意:我愿意尝试其他单元转换模块,但除了Unum之外不知道任何其他单元,并且发现它很麻烦.

编辑:好的,现在很清楚,我想要做的是首先确定要比较的两个量是否在同一个坐标系中.(如时间单位参考不同的时期或时区或dB到直线幅度),进行适当的变换,然后进行转换.有没有通用的坐标系管理工具?那太好了.

我会假设°F和°C总是指表达式中的Δ°FΔ°C,但是单独站立时指的是绝对值.我只是想知道是否有办法制作units.degF一个函数并property()在其上拍一个装饰器来处理这两个条件.

但是现在,我将设置units.C == units.K并尝试在文档中清楚地说明使用函数convertCtoK(...)convertFtoR(...)处理绝对单位时.(开个玩笑.不,我不会.)

python math symbolic-math sympy

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

在SymPy中反转矩阵?

我想知道如何使用Python中的SymPy创建矩阵并计算其逆?

例如,对于此符号矩阵:

python matrix sympy

11
推荐指数
2
解决办法
7750
查看次数

Sympy中的因子/收集表达

我有一个等式:

     R??V? + R??V? - R??V?
i? = ?????????????????????
     R??R? + R??R? + R??R?
Run Code Online (Sandbox Code Playgroud)

已定义,我想将其拆分为仅包含单个变量的因子 - 在本例中为V1和V2.

所以我希望如此

        -R?                        (R? + R?)
i? = V??????????????????????? + V???????????????????????
        R??R? + R??R? + R??R?      R??R? + R??R? + R??R?
Run Code Online (Sandbox Code Playgroud)

但到目前为止我能做到的最好的是

     -R??V? + V??(R? + R?)
i? = ?????????????????????
     R??R? + R??R? + R??R?
Run Code Online (Sandbox Code Playgroud)

使用equation.factor(V1,V2).因果或其他方法还有一些其他选项可以进一步分离变量吗?

python symbolic-math sympy symbolic-computation

11
推荐指数
1
解决办法
4669
查看次数

用Sympy方程绘制图

创建Sympy方程的最佳方法是什么,做一些类似于导数的方法,然后绘制该方程的结果?

我有我的符号方程,但无法弄清楚如何为绘图制作一组数值.这是我的代码:

from sympy import symbols
import matplotlib.pyplot as mpl

t = symbols('t')
x = 0.05*t + 0.2/((t - 5)**2 + 2)

nums = []
for i in range(1000):
    nums.append(t)
    t += 0.02

plotted = [x for t in nums]

mpl.plot(plotted)
mpl.ylabel("Speed")
mpl.show()
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我只计算了该方程的导数,现在我想绘制速度x,所以这相当简单.

python symbols matplotlib sympy python-3.x

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

SymPy:从对角矩阵创建一个numpy函数,它采用numpy数组

基于我在这里找到的一个例子,我试图从使用的对角矩阵创建一个函数sumpy.diag

myM = Matrix([
[x1, 4, 4],
[4, x2, 4],
[4, 4, x3]])  
Run Code Online (Sandbox Code Playgroud)

这是使用此例程创建的,例如:

import sympy as sp
import numpy as np

x1 = sp.Symbol('x1')
x2 = sp.Symbol('x2')
x3 = sp.Symbol('x3')
X = sp.Matrix([x1, x2, x3])

myM = 4 * sp.ones(3, 3)
sp.diag(*X) + myM - sp.diag(*np.diag(myM))
Run Code Online (Sandbox Code Playgroud)

现在我将要创建一个函数,使用lambdifyufuncify,采用一个numpy.array或长度3(像np.array([0.1,0.2,0.3]))作为输入,并给出输出作为根据矩阵myM

myM = Matrix([
[0.1, 4, 4],
[4, 0.2, 4],
[4, 4, 0.3]])  
Run Code Online (Sandbox Code Playgroud)

最终我需要使用这种方法象征性地创建雅可比矩阵: 雅可比 并且由于函数形式可能在计算过程中发生变化,因此以符号方式计算雅可比矩阵将非常有用.

python numpy matrix symbolic-math sympy

11
推荐指数
2
解决办法
713
查看次数

为什么SymPy计算错误的飞机交叉点?

我有一个奇怪的问题,SymPy中的平面交叉点可以用简单的例子,但是对于坐标更复杂的一个,它会失败.我发布了一个有效的简单示例和失败的示例.正如Povray图像所示,我有三个平面穿过多面体的顶点并垂直于穿过相应顶点和中心的直线.我想计算这些平面相交的点,但是SymPy给出了平面对相交的线的错误结果.在图像中,正确的交叉点可以看作短线(用CSG交叉点创建).与它们平行的长线是由SymPy计算的线.

我做错了什么,或者这是SymPy中的错误?

更多图片在这里:http ://paste.watchduck.net/1712/sympy_planes/
有谁知道如何在页面上放置许多图像,而不是不发布问题?("您的帖子似乎包含未正确格式化为代码的代码.")

作品

码:

from sympy import Point3D, Plane


pointR = Point3D(1/2, 0, 1/2)
pointG = Point3D(1, 0, 0)

planeR = Plane(pointR, pointR)
planeG = Plane(pointG, pointG)

print('\n######## Intersection of the planes:')
lineRG = planeR.intersection(planeG)[0]  # yellow
print(lineRG)

print('\n######## Intersection of plane and contained line returns the line:')
lineRG_again = planeR.intersection(lineRG)[0]
print(lineRG_again.equals(lineRG))
Run Code Online (Sandbox Code Playgroud)

输出:

######## Intersection of the planes:
Line3D(Point3D(1, 0, 0), Point3D(1, 1/2, 0))

######## Intersection of plane and contained line …
Run Code Online (Sandbox Code Playgroud)

python symbolic-math sympy

11
推荐指数
1
解决办法
430
查看次数