请考虑这个脚本:
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
之前计算,并且无法更改排序,以适应我实际代码中的所有依赖项。
答案 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')
再次有效