the*_*alk 6 matlab symbolic-math computer-algebra-systems 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), " = ", context(y));
end_proc:
evalPrintEq2 := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
Run Code Online (Sandbox Code Playgroud)
呼叫:
evalPrintVal(U_1,15000*unit::V);
evalPrintEq(E_h, U_1*1.05);
evalPrintEq2(E_h, U_1*1.05);
Run Code Online (Sandbox Code Playgroud)
输出:
这是一个范围问题。MuPAD 与大多数其他编程语言没有什么不同,方法/函数/过程的词法范围有限。域DOM_VAR
类型指的是过程的局部变量(这里多一点)。在将变量传递给 Matlab 函数(用于此目的)之前,您无法直接查看变量的名称inputname
,MuPAD 也不例外。此外,参数通常在传递到函数或过程之前进行评估。
幸运的是,就编码而言,修复非常简单。首先,您需要为hold
您的proc
. 这似乎既阻止了对输入参数的求值,又允许访问“过程调用中使用的形式的实际参数”。然后您需要使用context
来评估输出的最后部分。结果过程如下所示:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", context(y));
end_proc:
Run Code Online (Sandbox Code Playgroud)
然后
x_a := 2*unit::mm;
y_b := 5*unit::mm;
evalPrint(z, x_a+y_b);
z;
Run Code Online (Sandbox Code Playgroud)
回报
但是,由于这是在过程中完成的,因此 的值z
并未像内联表达式中那样在全局范围内分配值。为了处理这个问题,evalassign
可以使用该函数:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:
Run Code Online (Sandbox Code Playgroud)
现在返回7 mm
像z
您的内联表达式一样:
这种形式也有效,并且稍微简洁一些:
evalPrint := proc(x,y) option hold;
begin
output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:
Run Code Online (Sandbox Code Playgroud)
在 R2015a 中测试。