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

时间:2015-07-28 09:05:44

标签: matlab symbolic-math computer-algebra-systems mupad

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

假设两个变量赋值:

x_a:=2*unit::mm;
y_b:=5*unit::mm;

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

z = x_a + y_b = 7 mm

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

output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)

看起来符合要求:

enter image description here

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

evalPrint(z,x_a+y_b)

我该怎么做?

我尝试了什么:

我写了一个程序如下:

evalPrint :=
proc(x,y) begin
  output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:

但我得到了

enter image description here

我缺少什么?

关于horchler's answer:他的第一个解决方案确实不起作用,而第二个解决方案确实起作用:

过程:

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:

呼叫:

evalPrintVal(U_1,15000*unit::V);
evalPrintEq(E_h, U_1*1.05);
evalPrintEq2(E_h, U_1*1.05);

输出:

enter image description here

1 个答案:

答案 0 :(得分:4)

这是scope的问题。 MuPAD与大多数其他编程语言没有区别,因为方法/函数/过程具有有限的lexical scopeDOM_VAR域类型引用过程的局部变量(多一点here)。在将变量传递给Matlab函数之前,您无法直接看到该变量的名称(对此使用inputname),并且MuPAD也不例外。此外,通常在 之前对参数进行评估,然后将它们传递给函数或过程。

幸运的是,在编码方面,修复非常简单。首先,您需要为hold使用proc选项。这似乎既阻止了对输入参数的评估,又允许访问“过程调用中使用的表单中的实际参数”。然后,您需要使用context来评估输出的最后部分。结果程序如下所示:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", context(y));
end_proc:

然后

x_a := 2*unit::mm;
y_b := 5*unit::mm;
evalPrint(z, x_a+y_b);
z;

返回

MuPAD output one

但是,由于这是在一个过程中完成的,因此z的值未在内联表达式中的全局范围中赋值。要处理此问题,可以使用evalassign函数:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:

现在返回7 mm的{​​{1}},就像您的内联表达式一样:

MuPAD output two

这个表格也很有效,而且更简洁:

z

在R2015a中测试过。