带符号的matlab,如何缩短数字?

时间:2015-04-25 18:00:38

标签: matlab symbolic-math

syms w
A=[141432432 23432*w; 31432*w 3543566]
B=[13432*w^2 ; 3424324]

返回

A =
[ 141432432, 23432*w]
[   31432*w, 3543566]

B =
 13432*w^2
   3424324

然后

C=A\B
c1=C(1)
simplify(c1)

返回

C =
 -(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641))
    (2*(6596791*w^3 - 7567351113687))/(23016082*w^2 - 15661723666641)

c1 =
-(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641))

ans =
-(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641))

我想将c1简化为类似的内容,

c1 = -(w*(3*e^9*w-5.01*e^9))/......

我该怎么做?当我不使用syms变量时,数字看起来很好。但是,如果我使用它,公式看起来很脏。

1 个答案:

答案 0 :(得分:2)

看起来很脏,"但这是符号数学的重点 - 它对原始输入的完全精确度是准确的。如果您想要十进制格式的结果,您应该意识到它必然不太精确,除非这些值可以精确地表示为(足够短的)有限十进制扩展。在Matlab的符号数学工具箱中,您只需使用vpa函数将结果转换为variable precision arithmetic

syms w;
c1 = -(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641));
vpa(c1)

返回

-(1.0*w*(2974823657.0*w - 5014922498.0))/(46032164.0*w^2 - 31323447333282.0)

在这种情况下,这对你没什么帮助。如果你想要的精确度低得多,如你的问题所示,你可以使用digitsvpa的第二个参数:

syms w;
c1 = -(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641));
vpa(c1,3) % default value is 32

现在返回的精确度要低得多

-(1.0*w*(2.97e9*w - 5.01e9))/(4.6e7*w^2 - 3.13e13)


最后,您还可以使用遗憾名称matlabFunction将符号表达式转换为浮点函数:

syms w;
c1 = -(w*(2974823657*w - 5014922498))/(2*(23016082*w^2 - 15661723666641));
c1_fun = matlabFunction(c1)

返回anonymous function

c1_fun =

    @(w)-(w.*(w.*2.974823657e9-5.014922498e9))./(w.^2.*4.6032164e7-3.1323447333282e13)