标签: computer-algebra-systems

如何使用 sympy 求解绝对值方程?

给定方程 |x - 5| + |y| = 5,如何使用 SymPy 解决它?

如果我使用solve()和Abs()的组合,它会给我这个错误

当参数不是实数或虚数时求解 Abs(x - 5)

但是,在会议开始时我写下了

x, y, z = symbols('x, y, z', RealNumber = True)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

谢谢!

python equation sympy computer-algebra-systems equation-solving

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

符号计算和函数式编程是否相关?

我在想,如果符号计算计算机代数系统(如在Matlab,数学符号工具箱)和函数式编程相关的,怎么样?前者属于后者吗?

感谢致敬!

functional-programming symbolic-math computer-algebra-systems

6
推荐指数
1
解决办法
911
查看次数

方程式等式测试(在C++中或使用Unix工具)(代数函数同构)

我正在寻找C++开源库(或者只是开源的Unix工具):方程式上的等式测试.

方程式可以在运行时期间构建为AST树,字符串或其他格式.

方程式主要是简单的代数方程式,对未知函数有一些假设.域,将是整数算术(没有浮点问题,因为相关问题是众所周知的 - 感谢@hardmath强调它,我认为它是已知的).

示例:输入可能包含函数phi,有关于它的假设(大多数情况)phi(x,y)=phi(y,x)并尝试解决:

equality_test( phi( (a+1)*(a+1) , a+b ) = phi( b+a, a*a + 2a + 1 )

它可以是模糊的或任何相等的测试 - 我的意思是,它不必总是成功(即使方程式相等,它也可能返回"假").

如果支持关于phi函数的上述假设存在问题,我可以处理这个,所以也欢迎简单的线性代数方程等式测试器.

  • 你能推荐一些C/C++编程库或Unix工具吗?(开源)
  • 如果可能的话,你可以附上一些例子,在给定的库/工具中,这样的等式测试可能会是什么样子?

PS如果这样的equality_test可以(在成功的情况下)返回同构 - (我的意思是,一种"映射") - 在两个给定的方程之间,将非常受欢迎.但是,没有这种功能的工具也非常受欢迎.

PS通过"模糊测试器"我的意思是内部方程求解器在寻找两个函数的"同构"方面将是"模糊的",而不是在对随机输入的测试方面 - 我可以实现这一点,当然,但我尝试找到更精确的东西.

PPS还有另一个问题,为什么我需要更好的性能解决方案,而不是暴力"所有输入测试".上面的公式是我的内部问题的simplyfied形式,在这里我没有在方程的变量之间的映射.也就是说,我有eq1=phi( (a+1)*(a+1) , a+b )eq2=phi( l+k, k*k + 2k + 1 ),和我必须找出a==kb==l.但是这个子问题我可以用"暴力"方法处理(甚至这种方法的渐近复杂性),只有几个变量,让它为8.所以我需要为每个可能的映射做这个equation_test.如果有一个工具可以完成整个工作,我会非常感激,并且可以为这样的项目做出贡献.但我不需要这样的功能,只需通过equation_test()即可,我可以轻松处理休息.

把它们加起来:

  • equality_test()只是我必须解决的许多子问题之一,因此计算复杂性很重要.
  • 它不一定是100%可靠,但更高的可能性,而不仅仅是测试具有一些随机输入和变量映射的方程式非常受欢迎:).
  • 输出"是"或"否"(所有其他信息可能有用,但将来,在此阶段我需要"是"/"否")

c++ math open-source discrete-mathematics computer-algebra-systems

6
推荐指数
1
解决办法
1474
查看次数

用于仿射k-代数计算的库?

我正在寻找一个库或计算机代数系统,它将帮助计算环中多项式的运算

F_2[x_1, ..., x_n] / <f^2 - f>
Run Code Online (Sandbox Code Playgroud)

其中F_2是2-元素的有限域,并且<f^2 - f>是从元件所产生的理想f^2 - f对所有fF_2[...].(我认为/希望/我很确定这是使用xor作为+和*[ 维基百科 ] 的布尔代数环).

例如,

x_1 = poly_xn 1
x_2 = poly_xn 2
x_1 * x_2 * x_1 -- returns "x_1 * x_2"
x_1 + x_1 + x_2 -- returns "x_2"
Run Code Online (Sandbox Code Playgroud)

我已经在Haskell中为此编写了代码,但不幸的是性能不是很好.

注意:标题"仿射k-代数"来自艾森伯德的交换代数,其中包含代数几何的观点.35; 如果有更好的名字请编辑问题,谢谢!

haskell polynomial-math computer-algebra-systems

6
推荐指数
1
解决办法
150
查看次数

C#库重载^运算符.如何使用**代替?

象征库重载算术运算符.虽然它是用C#编写的,但我可以在F#中使用它:

open Symbolism

let x = new Symbol("x")
let y = new Symbol("y")
let z = new Symbol("z")

printfn "%A" (2*x + 3 + 4*x + 5*y + z + 8*y)
Run Code Online (Sandbox Code Playgroud)

输出:

3 + 6 * x + 13 * y + z
Run Code Online (Sandbox Code Playgroud)

但是,它也会超负荷^.这当然不适合F#.

作为解决方法的一步,我导出了一个权限的方法组:

printfn "%A" (Aux.Pow(x, 2) * x)
Run Code Online (Sandbox Code Playgroud)

输出:

x ^ 3
Run Code Online (Sandbox Code Playgroud)

如何重载**以使用Aux.Pow方法组?

我可以这样做:

let ( ** ) (a: MathObject) (b: MathObject) = Aux.Pow(a, b)
Run Code Online (Sandbox Code Playgroud)

这对MathObject价值观有效:

> …
Run Code Online (Sandbox Code Playgroud)

f# symbolic-math computer-algebra-systems symbolic-computation

6
推荐指数
2
解决办法
440
查看次数

区分后整理表达

我在这个问题中使用的方程包含指数.由于这个原因,在区分之后,除了额外的常数和其他因素之外,它们几乎没有变化.我想知道是否有可能将这些指数收回到他们所在表达式的名称中.这是一个例子:

鉴于此功能定义

f:= x -> A*exp(B/x)
Run Code Online (Sandbox Code Playgroud)

区别后,人们会得到

A*exp(B/x)*(-B/x^2)
Run Code Online (Sandbox Code Playgroud)

如果我能以某种方式将它转换为它将会很棒

f(x)*(-B/x^2)
Run Code Online (Sandbox Code Playgroud)

这可能是MuPad或任何其他CAS包吗?

matlab symbolic-math computer-algebra-systems mupad

6
推荐指数
1
解决办法
265
查看次数

同情的多元泰勒近似

我的目标是使用sympy哪个来编写多维泰勒近似

  • 使用尽可能多的内置代码,
  • 计算两个变量的给定函数的截断泰勒近似
  • 返回没有 Big-O-remainder项的结果,例如in sin(x)=x - x**3/6 + O(x**4).

这是我到目前为止尝试的内容:

方法1

天真地,人们可以只series为每个变量组合两次命令,遗憾的是这不起作用,如本例所示sin(x*cos(y)):

sp.sin(x*sp.cos(y)).series(x,x0=0,n=3).series(y,x0=0,n=3)
>>> NotImplementedError: not sure of order of O(y**3) + O(x**3)
Run Code Online (Sandbox Code Playgroud)

方法2

基于这篇文章,我首先写了一个1D泰勒近似:

def taylor_approximation(expr, x, max_order):
    taylor_series = expr.series(x=x, n=None)
    return sum([next(taylor_series) for i in range(max_order)])
Run Code Online (Sandbox Code Playgroud)

用1D示例检查它可以正常工作

mport sympy as sp
x=sp.Symbol('x')
y=sp.Symbol('y')
taylor_approximation(sp.sin(x*sp.cos(y)),x,3)

>>> x**5*cos(y)**5/120 - x**3*cos(y)**3/6 + x*cos(y)
Run Code Online (Sandbox Code Playgroud)

不过,如果我知道这样做既扩张做一个链接调用xy,sympy挂断

# this does not work
taylor_approximation(taylor_approximation(sp.sin(x*sp.cos(y)),x,3),y,3)
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决这个问题或以另一种方式实现它吗?

python sympy computer-algebra-systems symbolic-computation

6
推荐指数
2
解决办法
2745
查看次数

漂亮的MuPad:分配,表达和结果输出在一行 - 如何创建该功能?

我试图让Matlabs的MuPad像MathCad一样漂亮和方便.

假设两个变量赋值:

x_a:=2*unit::mm;
y_b:=5*unit::mm;
Run Code Online (Sandbox Code Playgroud)

我想要一个漂亮的(带有Tex的排版)输出

z = x_a + y_b = 7 mm
Run Code Online (Sandbox Code Playgroud)

我已经设法通过使用output::mathText(...):

output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)
Run Code Online (Sandbox Code Playgroud)

看起来像所希望的:

在此输入图像描述

但这不是很方便,也不易读.所以我试图将它包装成宏或函数:

evalPrint(z,x_a+y_b)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?


我尝试了什么:

我写了一个程序如下:

evalPrint :=
proc(x,y) begin
  output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:
Run Code Online (Sandbox Code Playgroud)

但我得到了

在此输入图像描述

我错过了什么?


关于霍希勒的答案:他的第一个解决方案确实不起作用,而第二个解决方案确实如此:

程序:

evalPrintVal := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y));
end_proc:
evalPrintEq := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y), " = …
Run Code Online (Sandbox Code Playgroud)

matlab symbolic-math computer-algebra-systems mupad

6
推荐指数
1
解决办法
337
查看次数

Scala的计算机代数系统(CAS)

我正在为scala寻找一个简单的CAS系统.

它应该具有以下功能:

  • 允许访问抽象语法树(最好通过case类来轻松匹配)
  • 解析String为AST
  • 简化表达

如果不存在并且我必须自己写一些基本的东西,那么最好的代表是什么?

我在想这样的事情:

abstract trait Term
{
  def simplify:Term
  def evaluate(assignment:Var => Double):Double
  def derivative:Term
}

case class Const(c:Int) extends Term
case class Var(x:String) extends Term

case class Negate(x:Term) extends Term
case class Subtract(x:Term, y:Term) extends Term
case class Divide(x:Term, y:Term) extends Term


object Add { def apply(x:Term*):Add = Add(x.toList) }
case class Add(xs : List[Term]) extends Term

object Multiply { def apply(x:Term*):Multiply = Multiply(x.toList) }
case class Multiply(xs:List[Term]) extends Term

case class Power(x:Term, …
Run Code Online (Sandbox Code Playgroud)

implementation cas scala computer-algebra-systems

5
推荐指数
1
解决办法
1501
查看次数

优化一组多项式以获得计算速度

我有一组由计算机代数系统(CAS)产生的多项式表达式.例如,这是该集合的一个元素.

-d*d*L*L*QB*B*L*L*Q + 2*d*F*Ĵ*L*Q + 2*b*表F*H*L*QF*F*Ĵ*Ĵ*QB*b*表Ĵ*∫*q + 2*b*表d*H*Ĵ*QF*F*H*H*QD*d*H*H*q + b*b*∫*∫*○*O-2*b*d*H*Ĵ*○*O + d*d*H*H*○*0-2*b*b*∫*L*N*O + 2*b*表d*H*L*n个*O + 2*b*表F*H*Ĵ*N*0-2*d*F*H*H*N*O + 2*b*表d*∫*L*M*0-2*d*d*H*L*M*0-2*b*表F*Ĵ*∫*M*O + 2*d*F*H*Ĵ*M*O + b*b*L*L*N*N-2*b*表F*H*L*N*N + F*F*H*H*N*N-2*b*表d*L*L*m*n个+ 2*b*表F*Ĵ*L*米*N + 2*d*F*H*L*m*n个-2*F*F*H*Ĵ*m*n个+ d*d*L*L*m*m的-2*d*F*Ĵ*L*M*M + F*F*Ĵ*Ĵ*m*m的

我需要尽快在C程序中执行所有这些操作.如果你仔细研究这些公式中的任何一个,很明显我们可以优化它们的计算速度.例如,在上面粘贴的多项式中,我可以立即看到术语-d*d*l*l*q,2*d*f*j*l*q和-f*f*j*j*q,这样我就可以用-q*square(d*lf*j)替换它们的总和.我相信这里可以做很多这样的事情.我不相信(但也许我错了)任何编译器都能找到这个优化,或者更高级的优化.我试图让maxima(一个CAS)为我做这个,但没有任何结果(因为我是极限初学者,我可能错过了一个神奇的命令).所以,我的第一个问题是:我们可以使用什么工具/算法来优化多项式表达式以获得计算速度?

当优化一组共享大多数变量的多项式表达式时,事情变得更加复杂.实际上,通过表达式优化表达式可能是次优的,因为在优化之前编译器可以识别公共部分,但是如果不作为整体执行则不再存在.所以,我的第二个问题是:我们可以使用哪些工具/算法来优化一组多项式表达式以获得计算速度?

最好的祝福,

PS:这篇文章与" 计算机代数软件以及最小化一组多项式中的操作数量 "有一些相似之处,但是那一点给出的答案指向CAS程序而不是说我们如何使用它们来实现我们的目标.

algorithm optimization performance computer-algebra-systems polynomials

5
推荐指数
1
解决办法
139
查看次数