与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)
但我相信有更好的方法)
同情我有一个积分返回一个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
我有一个同意写的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 …
请考虑以下示例
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?
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(...)处理绝对单位时.(开个玩笑.不,我不会.)
我有一个等式:
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).因果或其他方法还有一些其他选项可以进一步分离变量吗?
创建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,所以这相当简单.
基于我在这里找到的一个例子,我试图从使用的对角矩阵创建一个函数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)
现在我将要创建一个函数,使用lambdify的ufuncify,采用一个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)
最终我需要使用这种方法象征性地创建雅可比矩阵:
并且由于函数形式可能在计算过程中发生变化,因此以符号方式计算雅可比矩阵将非常有用.
我有一个奇怪的问题,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 ×10
sympy ×10
matrix ×2
numpy ×2
math ×1
matplotlib ×1
orthogonal ×1
python-3.x ×1
scipy ×1
states ×1
symbols ×1