标签: symbolic-math

Matlab/Mupad符号简化,输出漂亮

我需要自动简化一些符号表达式,但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)

matlab symbolic-math simplify mupad

8
推荐指数
1
解决办法
937
查看次数

sympy:'Transpose'对象没有属性tolist

我试图用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)

python matrix symbolic-math sympy

8
推荐指数
1
解决办法
803
查看次数

.NET的符号数学

我正在寻找.NET框架的符号数学库.我看过Math.net,但它还没有用.你知道是否还有另一个图书馆吗?

math symbolic-math

7
推荐指数
1
解决办法
2273
查看次数

如何在 sympy 中取矩阵的元素对数?

使用 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”)。

有什么解决办法吗?

python symbolic-math sympy

7
推荐指数
1
解决办法
2404
查看次数

Sympy:在多项式中删除高阶项

使用Sympy,假设我们有一个表达式f,它是符号"x"(以及可能的其他符号)的多项式.

我想知道如果有一种有效的方法可以删除大于某个整数n的f中的所有项.

作为一个特例,我有一个非常复杂的功能,但我想只保留x中的第二个订单.有效的方法是什么?

这种明显的,非常有效的方法是每m小于n,取m个导数并将x设为0,得到x ^ m的系数.我们以这种方式获得每个系数,然后重建多项式.但是采取衍生品并不是最有效的方法.

python symbolic-math sympy computer-algebra-systems polynomials

7
推荐指数
1
解决办法
2446
查看次数

允许分别提供等比较器和散列函数的映射

在尝试对多项式进行建模时,特别是它们的乘法,我遇到了以下问题.在乘法期间,两个多项式的单个单项式相乘,当然可以发生我有(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的地图,而是使用专用的地图,那么有没有更好的想法如何融合单项式?

java hashmap symbolic-math polynomials

7
推荐指数
1
解决办法
5681
查看次数

如何使用sympy简化复杂常量的表达式?

我在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在替换后尝试).

有没有更好的方法来减少这种情况?我有许多类似的复杂常量表达式,我想知道它们是真实的(或不是).

python math symbolic-math sympy

7
推荐指数
2
解决办法
4761
查看次数

如何简化sympy中指数的对数?

当我打字

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. 我知道此功能“没有任何保证”。

题。是否有一些特定的简化(通过级数扩展或其他方式)将指数的对数转换为恒等函数?

python symbolic-math sympy

7
推荐指数
2
解决办法
3887
查看次数

sympy - 符号数量的元素的符号总和

在“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 的解决方案?

linear-equation symbolic-math sympy

7
推荐指数
1
解决办法
3049
查看次数

如何从Matlab中的公式中计算特定变量?

假设我有一个像这样的公式的列向量

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从公式或公式向量中分解出指定的变量?

matlab symbolic-math

7
推荐指数
1
解决办法
84
查看次数