我首先定义一些微分方程:
%% 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;
我现在正试图计算R
和L
。输入和输出变量来自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:
具体做法是:
id = 0.7522
ud = 0.3332
iq = 0.6803
ome = 0.6803
答案 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