2013-11-10 4 views
2

Я пытаюсь имитировать нелинейную тормозную систему автомобиля с ode45.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]); 
+0

+1 для отображения соответствующей информации, а не только «У меня есть ошибка «! =) –

ответ

1

Я уверен, что ваша ошибка в этом заявлении:

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

, как вы пишете, вы пытаетесь использовать x(2)/(1+Y)*rw в качестве индекса скаляра 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)); 
+0

Большое спасибо. –

Смежные вопросы