我们知道1+2+...+n等于n(n+1)/2.
但是如果我们事先不知道它,我们可以以编程方式获得相同的结果吗?
关于为什么我有这样的问题.
想想更复杂的情况:
X1 + X2 + ... + Xk = n,其中Xi是整数且> = 0.
什么是期望X1^2+...Xk^2?
结果并不明显只是一目了然,一旦我们弄清楚期望的(详细的)数学表示,我们就会想要将它提供给程序来减少代数. X1^2+...Xk^2
的象征库重载算术运算符.虽然它是用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
我试图让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) 我sympy在Jupyter笔记本中使用v1.0 .我无法通过表达来简化我的喜好.这是一个玩具的例子; 它做同样的事情,我更复杂的表达做...
import sympy
sympy.init_printing(use_latex='mathjax')
x, y = sympy.symbols("x, y", real=True, positive=True)
sympy.simplify(sqrt(2*x/y))
Run Code Online (Sandbox Code Playgroud)
给我...
但我更喜欢......
我怎样才能sympy以这种方式组织事物?我尝试了其他一些simplify功能,但它们都给了我相同的结果.还是我错过了别的什么?
我有一个多元多项式(在一般情况下有许多变量),其系数列出了我需要读取的一些数据,但看起来似乎没有一个很好的方法来做到这一点.
该collect功能似乎是正确的想法,但是当你有几个变量使用它,它实际上并没有给你个人单项式,但单项的比较奇怪的分组依赖你列出的变量的顺序.
有谁知道这样做的方法?
我有一些大小合适的矩阵(2000*2000),我希望在矩阵的元素中有符号表达式 - 即元素的.9**b + .8**b + .7**b ...一个例子.矩阵非常稀疏.
我通过添加中间计算来创建这些矩阵.我想将它们存储到磁盘中以便稍后读取并使用不同的值进行评估b.
我已经玩过同情,它确实完成了我需要它做的事情,但是做简单的添加是令人头脑麻木的慢.从我所看到的,似乎theano或tensorflow可能能够用Tensors做到这一点,但我无法弄清楚如何在Tensor中放置一个符号.
任何人都可以指出我正确的方向,使用这个任务的最佳工具?我更喜欢它在python中,但是如果python以外的东西能做到这一点也很好.
我在使用sympy计算符号表达式的逆拉普拉斯变换时遇到了一些麻烦.在matlab和书中我正在使用表达式s /(s ^ 2 + w ^ 2)转换为cos(wt).
当我尝试使用这样的情感时这样做:
expression = s/(s**2+w**2)
Answer = sympy.inverse_laplace_transform(expression, s, t)
Run Code Online (Sandbox Code Playgroud)
我明白了
Answer = (-I*exp(2*t*im(w))*sin(t*re(w)) + exp(2*t*im(w))*cos(t*re(w)) + I*sin(t*re(w)) + cos(t*re(w)))*exp(-t*im(w))*Heaviside(t)/2
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
与数值计算相比,符号数学计算(特别是对于求解非线性多项式系统)会导致巨大的性能(计算速度)劣势吗?有没有关于此的基准/数据?
发现了一个相关的问题:https://scicomp.stackexchange.com/questions/21754/symbolic-computation-vs-numerical-computation
algorithm performance symbolic-math numerical-computing numerical-methods
我正在尝试计算M大小符号复杂矩阵的特征值3x3.在某些情况下,eigenvals()完美的工作.例如,以下代码:
import sympy as sp
kx = sp.symbols('kx')
x = 0.
M = sp.Matrix([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
M[0, 0] = 1.
M[0, 1] = 2./3.
M[0, 2] = 2./3.
M[1, 0] = sp.exp(1j*kx) * 1./6. + x
M[1, 1] = sp.exp(1j*kx) * 2./3.
M[1, 2] = sp.exp(1j*kx) * -1./3.
M[2, 0] = sp.exp(-1j*kx) * 1./6.
M[2, 1] = sp.exp(-1j*kx) * -1./3.
M[2, 2] = sp.exp(-1j*kx) * 2./3.
dict_eig = …Run Code Online (Sandbox Code Playgroud) 我正在评估Math.NET Symbolics,以便在我们的应用程序中使用,我们需要一个简单的数学解析器,供用户根据我们的测量数据计算自定义方程.我们的数据采用复数形式.
要测试我在LINQPad中使用以下代码片段:
var complexA = new Complex(1, 1);
var complexB = new Complex(1, 2);
var symbols = new Dictionary<string, FloatingPoint>()
{
{ "a", complexA },
{ "b", complexB }
};
Evaluate.Evaluate(symbols, Infix.ParseOrUndefined("1/(a*b)+cos(b)")).ComplexValue.Dump();
Run Code Online (Sandbox Code Playgroud)
这很好用,但是我找不到以下运算符:
我们如何获得符号的REAL或IMAGINARY部分?
我试过real(b)和imag(b),但没有奏效.
作为一种解决方法,我也可以做以下事情,但我更喜欢像我这样的运营商abs(b):
var complexA = new Complex(1, 1);
var complexB = new Complex(1, 2);
var symbols = new Dictionary<string, FloatingPoint>()
{
{ "a", complexA },
{ "b", complexB },
{ "b_REAL", complexB.Real },
{ "b_IMAG", …Run Code Online (Sandbox Code Playgroud) c# symbolic-math mathnet-numerics mathdotnet-symbolics math.net
symbolic-math ×10
sympy ×5
python ×4
algorithm ×2
algebra ×1
c# ×1
eigenvalue ×1
expression ×1
f# ×1
math ×1
math.net ×1
matlab ×1
mupad ×1
performance ×1
python-2.7 ×1