2

我正在尝试使用 ode45 模拟非线性车辆制动系统。

我花了很短的时间来学习 MATLAB。然后,我不知道为什么会发生错误。

如果您能指出错误并告诉我如何解决,将不胜感激。

代码 1. 主脚本代码 2. 功能代码 3. 错误

    clear;
    global m f Jw rw Fz Cd p A bw fw Nw g uw seta Te Tb T p0
    x = [0 0.025 0.05 0.1 0.125 0.15 0.175 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1]
    y = [0 0.225 0.45 0.65 0.685 0.705 0.69 0.68 0.65 0.635 0.63 0.6275 0.625 0.6225 0.62 0.6175 0.615 0.6125 0.610 0.6075 0.6050 0.6 0.5975 0.5950]
    %plot(x,y)
    p0=polyfit(x,y,6)
    %y=polyval(p,x)

    m = 1400; f = 0.01; Jw = 0.65; rw = 0.31; Fz = 3560.0; Cd = 0.5; p = 1.202; A = 1.95;
    bw = 0.0; fw = 0.0; Nw = 4; g = 9.81; uw = 0.0; seta = 0.0; Te = 0.0; Tb = 1000.0; T = Te - Tb;



[t,i] = ode45(@dott,[0.0 1.0],[20 20]);
plot(t,i);
axis([0 1 0 20]);
legend('x1','x2');

function xdot = dott(t,x)
global m f Jw rw Fz Cd p A Nw Te Tb p0
X = [0 0.025 0.05 0.1 0.125 0.15 0.175 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
Y = [0 0.225 0.45 0.65 0.685 0.705 0.69 0.68 0.65 0.635 0.63 0.6275 0.625 0.6225 0.62 0.6175 0.615 0.6125 0.610 0.6075 0.6050 0.6 0.5975 0.5950];
%UNTITLED2 Summary of this function goes here
%Detailed explanation goes here
xdot = zeros(2,1);
Y=p0(1,1)*((x(2)-x(1))/x(1))^6+p0(1,2)*((x(2)-x(1))/x(1))^5+p0(1,3)*((x(2)-x(1))/x(1))^4+p0(1,4)*((x(2)-x(1))/x(1))^3+p0(1,5)*((x(2)-x(1))/x(1))^2+p0(1,6)*((x(2)-x(1))/x(1))^1+p0(1,1)*((x(2)-x(1))/x(1));
xdot(1)=(-0.5*p*Cd*A(x(2)/(1+Y)*rw)*(x(2)/(1+Y)*rw)-f*m+Nw*Y*Fz)/(rw*m); 
xdot(2)=(Te-Tb-rw*Y*Fz)/Jw;

end

??? Subscript indices must either be real positive integers or logicals.

Error in ==> dott at 9
xdot(1)=(-0.5*p*Cd*A(x(2)/(1+Y)*rw)*(x(2)/(1+Y)*rw)-f*m+Nw*X*Fz)/(rw*m);

Error in ==> odearguments at 98
f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.

Error in ==> ode45 at 172
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in ==> a at 14
[t,i] = ode45(@dott,[0.0 1.0],[20 20]);
4

1 回答 1

1

我很确定您的错误在此声明中:

A(x(2)/(1+Y)*rw)

您编写它的方式是尝试将其x(2)/(1+Y)*rw用作 scalar 的索引A。我猜你想乘法是这样的:

... A * (x(2) / (1 + Y) * rw) ...

为了使代码更具可读性:

  1. 使用空格。长而紧凑的行真的很难阅读。
  2. 使用三个点将长线分成几条...

在我看来,这样的东西更容易阅读:

Y = p0(1,1) * ((x(2) - x(1)) / x(1))^6 + p0(1,2) * ...
    ((x(2) - x(1)) / x(1))^5 + p0(1,3) * ((x(2) - x(1)) / x(1))^4 ...
    + p0(1,4) * ((x(2) - x(1)) / x(1))^3 + p0(1,5) * ((x(2) - x(1)) / ...
    x(1))^2 + p0(1,6) * ((x(2) - x(1)) / x(1))^1 + p0(1,1) * ...
    ((x(2) - x(1)) / x(1));
于 2013-11-10T11:36:50.897 回答