我需要自动简化一些符号表达式,但simplifymatlab 的功能无法完成我需要的一切.
例:
simplify(expand((ax + bx)^2 + (ay + by)^2))
Run Code Online (Sandbox Code Playgroud)
这导致输出
ax^2 + 2*ax*bx + ay^2 + 2*ay*by + bx^2 + by^2
Run Code Online (Sandbox Code Playgroud)
所以我试图创建自己的规则,使输出更漂亮
function [ result ] = simplify_pretty( term )
read(symengine, 'simplify_pretty_rules.mu');
result = feval(symengine, 'Simplify', term, 'SelectRules = simplify_pretty_rules')
end
Run Code Online (Sandbox Code Playgroud)
与"simplify_pretty_rules.mu"
simplify_pretty_rules := proc()
begin
[
Rule(#X^2 - 2 * #X * #Y + #Y^2, (#X - #Y)^2),
Rule(#X^2 + 2 * #X * #Y + #Y^2, (#X + #Y)^2)
]
end_proc:
Run Code Online (Sandbox Code Playgroud)
这适用于像...这样的输入
simplify_pretty(expand((ax + bx)^2 …Run Code Online (Sandbox Code Playgroud) 我试图用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) 我正在寻找.NET框架的符号数学库.我看过Math.net,但它还没有用.你知道是否还有另一个图书馆吗?
使用 sympy 矩阵或 sympy 符号的 numpy 数组,如何取元素对数?
例如,如果我有:
m=sympy.Matrix(sympy.symbols('a b c d'))
Run Code Online (Sandbox Code Playgroud)
然后np.abs(m)工作正常,但np.log(m)不起作用(“AttributeError:log”)。
有什么解决办法吗?
使用Sympy,假设我们有一个表达式f,它是符号"x"(以及可能的其他符号)的多项式.
我想知道如果有一种有效的方法可以删除大于某个整数n的f中的所有项.
作为一个特例,我有一个非常复杂的功能,但我想只保留x中的第二个订单.有效的方法是什么?
这种明显的,非常有效的方法是每m小于n,取m个导数并将x设为0,得到x ^ m的系数.我们以这种方式获得每个系数,然后重建多项式.但是采取衍生品并不是最有效的方法.
python symbolic-math sympy computer-algebra-systems polynomials
在尝试对多项式进行建模时,特别是它们的乘法,我遇到了以下问题.在乘法期间,两个多项式的单个单项式相乘,当然可以发生我有(3x ^ 2 y + 5x y ^ 2)*(x + y).结果包含3x ^ 2 y ^ 2和5 x ^ 2 y ^ 2,我想通过添加立即组合.
当然,我想使用单项式的部分x ^ 2 y ^ 2作为(哈希)映射中的关键字来添加不同的系数(在示例中为3和5).但是我设想的单项式对象自然也应该包含系数,该系数不应该是地图键的一部分.
当然,我可以写单项对象的equals/hashcode,使它们忽略系数.但这感觉错了,因为数学上单项式显然只等于另一个,如果系数相等的话.
为中间操作引入无系数单项式对象也看起来不正确.
我没有使用地图,而是使用列表并使用二进制搜索和一个忽略系数的专用比较器.
如果没有使用不使用密钥'equals/hashcode的地图,而是使用专用的地图,那么有没有更好的想法如何融合单项式?
我在sympy中做了一些计算,结果最后是一组常量.其中一个直接插入下面的代码段:
from sympy import *
expr = (18**(Rational(1, 3))/(6*(3 + sqrt(3)*I)**(Rational(1, 3)))
+ 12**(Rational(1, 3))*(3 + sqrt(3)*I)**(Rational(1, 3))/12)
print(expr.evalf())
print(expr.simplify())
Run Code Online (Sandbox Code Playgroud)
这回来了
0.56857902130163 + 0.e-22*I
18**(1/3)/(6*(3 + sqrt(3)*I)**(1/3)) + (36 + 12*sqrt(3)*I)**(1/3)/12
Run Code Online (Sandbox Code Playgroud)
所以表达似乎是一个实数,但同情不能进一步简化它.用笔和纸,我简化了这个
cos(pi/18) / sqrt(3)
Run Code Online (Sandbox Code Playgroud)
它与返回的数值一致evalf().
我已经尝试了许多不同的简化函数,但似乎没有人能够进一步减少表达式.使用类似的替换
expr.subs(3 + sqrt(3)*I, sqrt(12) * exp(I*pi/6))
Run Code Online (Sandbox Code Playgroud)
改善表达,但仍然没有得到结论,它是真实的.使用欧拉的替代公式,
expr.subs(3 + sqrt(3)*I, sqrt(12) * (cos(pi/6) + I*sin(pi/6)))
Run Code Online (Sandbox Code Playgroud)
sympy最终能够得出结论表达式是真实的,但表达本身在打印时会大小爆炸(即使我simplify在替换后尝试).
有没有更好的方法来减少这种情况?我有许多类似的复杂常量表达式,我想知道它们是真实的(或不是).
当我打字
import sympy as sp
x = sp.Symbol('x')
sp.simplify(sp.log(sp.exp(x)))
Run Code Online (Sandbox Code Playgroud)
我得到
log(e^x)
Run Code Online (Sandbox Code Playgroud)
而不是x. 我知道此功能“没有任何保证”。
题。是否有一些特定的简化(通过级数扩展或其他方式)将指数的对数转换为恒等函数?
在“sympy”中表达以下内容的最合适方式是什么:
对样本 'x[i]' 的总和,其中 'i' 从具体的 0 到符号的 'N'。'x[i]' 本身应该是象征性的,即总是作为变量出现。
目标是在线性方程组中使用这些表达式。
示例(平凡最小二乘近似):
给定一组样本 (x[i], y[i]),它们应该位于由 'y = m*x + a' 给出的一条线上。即,估计线由“m”和“a”确定。样本和估计线之间的误差可以由下式给出
error(m, a) = sum((m * x[i] + a - y[i])**2, start_i=0, end_i=N)
Run Code Online (Sandbox Code Playgroud)
现在,在导数 'd/dm error(m,a)' 和 'd/da error(m,a)' 中搜索零转换提供了最小距离。我怎样才能找到 sympy 的解决方案?
假设我有一个像这样的公式的列向量
N =
4*k2 + 5*k3 + k1*x
7*k2 + 8*k3 + k1*y
Run Code Online (Sandbox Code Playgroud)
和像这样的符号变量的列向量
k =
k1
k2
k3
Run Code Online (Sandbox Code Playgroud)
公式相对于线性是线性的k.我想找到一个矩阵M,使得M*k等于N.
我可以这样做N/k.但是,这给了
[ (4*k2 + 5*k3 + k1*x)/k1, 0, 0]
[ (7*k2 + 8*k3 + k1*y)/k1, 0, 0]
Run Code Online (Sandbox Code Playgroud)
这是正确的,但不是我想要的.我想要的是矩阵
x 4 5
y 7 8
Run Code Online (Sandbox Code Playgroud)
在我看来,这是最简单的答案,因为它不涉及任何变量k.
我如何说服Matlab从公式或公式向量中分解出指定的变量?