分配双精度后,符号变量中的数字非常庞大

时间:2015-03-19 21:06:52

标签: matlab

我首先定义一些微分方程:

%% Definitions
% Constants
syms L R J Ke p
% Input
syms ud uq m
% Output
syms id iq ome theta
% Derivations
syms did diq dome dtheta
%% Equations
did=(ud/L)-(R/L)*id+ome*iq;
diq=(uq/L)-(R/L)*iq-ome*id-(Ke/L)*ome;
dome = (p/J)*((3/2)*p*Ke*iq-m);
dtheta = ome;

我现在正试图计算RL。输入和输出变量来自simulink:

idvalues = DQ_OUT.signals.values(:,1);
iqvalues = DQ_OUT.signals.values(:,2);
udvalues = UIdq.signals.values(:,1);
uqvalues = UIdq.signals.values(:,2);
% ... define some position in these arrays ...
% Define values for symbolic variables
id=idvalues(position);
ud=udvalues(position);
iq=iqvalues(position);
ome=iqvalues(position);

这些是双倍的。然后我eval第一个等式:

eval(did)

我得到了这个废话:

ans =

6002386699416615/(18014398509481984*L) - (846927175344863*R)/(1125899906842624*L) + 4168268387464377/9007199254740992

我在想像matlab这样的数学计算器不会因为变量类型而烦恼你,但我在这里看到的肯定是变量类型问题 - 实际值小于1:

image description

具体做法是:

id = 0.7522
ud = 0.3332
iq = 0.6803
ome = 0.6803

1 个答案:

答案 0 :(得分:1)

在进行符号计算时,Matlab对小小数使用有理数。这可以防止浮点数值问题并保持结果的准确性。但是,正如您所发现的那样,它会使结果更难以阅读。

Matlab还有一个vpa(变精度算术)函数,它能够在计算中保持高达2 ^(29)+ 1个数字(显然),这意味着Matlab不需要坚持合理的功能,以保持准确的结果。

在查看符号计算的输出之前,使用vpa将带有大分子/分母的有理数转换为十进制扩展,在您的情况下使用vpa(eval(did))

例如,定义

syms a
b=0.75221

然后a*b给出

>> a*b
ans =
(75221*a)/100000

vpa(a*b)给出了

>> vpa(a*b)
ans =
0.75221*a