如何格式化符号方程

时间:2017-08-16 23:44:57

标签: matlab symbolic-math

请考虑这个脚本:

clear variables
clc

syms a1 x1 t th(t) p(t)

x1 = a1*sin(th);
x2 = a2*sin(p) + x1;

运行上面的脚本会产生:

>> x2(t) = a2*sin(p(t)) + a1*sin(th(t))

第二个词实际上是x1

我的问题:有没有办法让MATLAB识别x1并打印出x2

>> x2(t) = a2*sin(p(t)) + x1

pretty()simplify()找不到任何希望。先谢谢你。

修改:要明确,x1必须在x2之前计算,并且无法更改排序,以适应我实际代码中的所有依赖项。

3 个答案:

答案 0 :(得分:1)

通常,当您从另一个变量为变量赋值时,它会检查该特定地址处的内容,选择它并在执行某些操作(如果有)后将其存储在新变量中。将值赋给新变量后,它与其他变量没有链接。

在您的情况下,可以做的事情之一是首先为其x2赋值。即。

syms a1 a2 x1 t th(t) p(t)
x2 = x1 + a2*sin(p);
x1 = a1*sin(th);

<强>结果:

>> x1

x1(t) =

a1*sin(th(t))

>> x2

x2(t) =

x1 + a2*sin(p(t))

现在,如果您要显示x2的内容x1,则可以使用subs,即

>> subs(x2, 'x1', x1)

ans(t) =

a2*sin(p(t)) + a1*sin(th(t)) 

所以反过来也是可能的。

修改

另一种可能性是,如果要以相同的顺序分配变量,则可以将符号表达式转换为char或字符串,然后将x1的值替换为x1

syms a1 a2  t th(t) p(t)
x1 =  a1*sin(th);
x2 = x1 + a2*sin(p);
strrep(char(x2),char(x1),'x1')

ans =

    'a2*sin(p(t)) + x1'

答案 1 :(得分:1)

这很简单,如下:

声明所有符号变量

syms a1 a2 x1 x2 th(t) p(t)

定义方程式(以任何顺序,无论依赖性)

x1 = a1*sin(th);
% other code ...
x2 = a2*sin(p) + x1;

然后您可以使用subs

  

subs(s,old,new)会返回s的副本,将所有old替换为new,然后评估s

subs(x2, x1, 'x1'); 

>> x1 + a2*sin(p(t))

现在,如果我们更改x1,我们可以更新它适合x2

的方式
x1 = a2*sin(p(t));
subs(x2,x1,'x1')
>> x1 + a1*sin(th(t))

答案 2 :(得分:0)

您可以使用subs将子表达式替换为另一个子表达式。例如,

syms a1 a2 t th(t) p(t)
x1 =  a1*sin(th);
x2 = x1 + a2*sin(p)+sin(th)*a1^2+a1*2*sin(th)
result = subs(x2,x1,'x1')

给出

  

结果(t)=

     

3 * x1 + a2 * sin(p(t))+ a1 * x1

但是,有时它不起作用;

x3= a1*2*sin(th/2)*cos(th/2)
result= subs(x3,x1,'x1')

给出

  

结果(t)=

     

2 * A1 * COS(第(T)/ 2)* SIN(第(T)/ 2)

subs(simplify(x3),x1,'x1')再次有效