我正在尝试使用[SymPy] [1]同时替换表达式中的多个术语.我用字典作为参数尝试了[subs function] [2],但发现它依次替换.
In : a.subs({a:b, b:c})
Out: c
Run Code Online (Sandbox Code Playgroud)
问题是第一次替换导致一个术语可以被第二次替换取代,但它不应该(因为我的原因).
关于如何同时进行替换的任何想法,没有它们相互干扰?
编辑: 这是一个真实的例子
In [1]: I_x, I_y, I_z = Symbol("I_x"), Symbol("I_y"), Symbol("I_z")
In [2]: S_x, S_y, S_z = Symbol("S_x"), Symbol("S_y"), Symbol("S_z")
In [3]: J_is = Symbol("J_IS")
In [4]: t = Symbol("t")
In [5]: substitutions = (
(2 * I_x * S_z, 2 * I_x * S_z * cos(2 * pi * J_is * t) + I_y * sin(2 * pi * J_is * t)),
(I_x, I_x * cos(2 * …Run Code Online (Sandbox Code Playgroud) 我使用Mathematica进行符号数学计算.我打算换成另一种语言.Matlab(我用于标准计算的东西)包括这个功能,但我正在研究使用Julia的可能性,因为它似乎是未来.然而,似乎没有可用的象征工具(在官方文档中没有提到).显然,唯一可用的软件包(SymPy)在官方网站(http://pkg.julialang.org/)上说"测试失败" .
有谁能在朱莉娅这样做?
同情我有一个积分返回一个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
请考虑以下示例
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(...)处理绝对单位时.(开个玩笑.不,我不会.)
我试图在Matlab中生成一个分段符号函数.它必须是符号的原因是我希望能够在之后集成/区分函数和/或插入实际值.我有以下功能:
x^3/6 -> 0 < x <= 1
(1/6)*(-3*x^3+12*x^2-12x+4) -> 1 < x <= 2
(1/6)*(3*x^3-24*x^2+60x-44) -> 2 < x <= 3
(1/6)*(4-x)^3 -> 3 < x <= 4
0 -> otherwise
Run Code Online (Sandbox Code Playgroud)
例如,我想把这个函数放在一个变量中(比如说f),然后调用
int(diff(f, 1)^2, x, 0, 4) % numbers could be different
Run Code Online (Sandbox Code Playgroud)
得到(标量)结果2/3.
我尝试了各种各样的事情,涉及分段()函数和符号比较,但没有任何效果......你能帮忙吗?:-)
我有一个等式:
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).因果或其他方法还有一些其他选项可以进一步分离变量吗?
基于我在这里找到的一个例子,我试图从使用的对角矩阵创建一个函数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) 我试图在MATLAB 2017a中集成一个常量函数,但我被卡住了.首先,当我使用以下脚本进行集成时,我得到了正确的输出.所以脚本适用于x0依赖的脚本t.
function E=sol(n,k)
x0 = @(t) t^(2);
j = 0;
E = zeros(n,1);
while j < n+1 ;
K = matlabFunction(subs(po(j,k))) ;
eval(sprintf('x%d = integral(K,0,1);',j+1)) ;
E(j+1,1) = subs(sprintf('x%d',j+1))
j = j+1;
end
end
Run Code Online (Sandbox Code Playgroud)
功能po(j,k)如下,
function A_j = po(j,k) % Adomian polynomials
if j >0
x = sym('x',[1 j]);
syms p; % Assinging a symbolic variable for p
syms x0;
S = x0+ sum(p.^(1:j) .* x) ; % Sum of p*x up to …Run Code Online (Sandbox Code Playgroud) symbolic-math ×10
python ×7
sympy ×7
math ×2
matlab ×2
julia ×1
matrix ×1
numpy ×1
piecewise ×1
substitution ×1