Index exceeds the number of array elements (1).
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
When I want to run and plot the quadratic solver, I met the error 'Index exceeds the number of array elements (1)'.
% Some code to show you how to handle arithmatic involving complex numbers
clc
clear
% We'll write some code that solves a simple quadratic equation.
% The roots of the quadratic can either be real or complex and this depends
% upon the coefficients in a the original equation.
%
% Equation has the form:
% ax^2+bx+c=0
%
% Coefficient 'c' varied in magnitude so that a mix of real and complex
% roots are generated. Top tip - the above equation could be the characteristic
% equation of the car and 'c' could be vehicle speed.
%
% Initialise the variables that define the roots of our quadratic (defined
% as complex numbers)
x1com=complex(0.0,0.0);
x2com=complex(0.0,0.0);
%
M_ul = 1995; Md = 60; I = 3877;
M = M_ul + Md;
l_f = 1.34; l_r = 1.12;l_wb = 2.46; Rmean = 60; t = 1.62;
K_f = 55000; K_r = 65000;u=1;
% Specify the values of the coefficients of the quadratic
a=1;
b=(2*M*(l_f^2*K_f+l_r^2*K_r)+2*I*(K_f+K_r))/M*u*I;
c=((4*K_f*K_r*l_wb^2)/(M*I*u^2))-(2*(l_f*K_f-l_r*K_r)/I);
%
for u=1:50
c=c(1+u);
b=b(u+1);
x1com=(-b+sqrt(b^2-4*a.*c))/(2*a);
x2com=(-b-sqrt(b^2-4*a.*c))/(2*a);
% Extract the real and imaginary parts from the roots of the quadratic
% (which have been calculated as complex numbers)
% Place these into real vectors
x1real(u)=real(x1com);
x1imag(u)=imag(x1com);
x2real(u)=real(x2com);
x2imag(u)=imag(x2com);
end
%
% Generate some graphs to illustrate results using the real vectors
% 1) Re vs Im
subplot(3,1,1)
plot(x1real(:),x1imag(:),'ko',x2real(:),x2imag(:),'b+')
% axis([xmin xmax ymin ymax]) % Use this to define axis limits
legend('Root 1','Root 2','Location','EastOutside')
title('Roots of quadratic equation');
grid on
xlabel('Real')
ylabel('Imaginary')
% 2) Re vs c
subplot(3,1,2)
plot(c(:),x1real(:),'ko',c(:),x2real(:),'b+')
% axis([xmin xmax ymin ymax]) % Use this to define axis limits
legend('Root 1','Root 2','Location','EastOutside')
grid on
xlabel('Coefficient c')
ylabel('Real')
% 3) Im vs c
subplot(3,1,3)
plot(c(:),x1imag(:),'ko',c(:),x2imag(:),'b+')
% axis([xmin xmax ymin ymax]) % Use this to define axis limits
legend('Root 1','Root 2','Location','EastOutside')
grid on
xlabel('Coefficient c')
ylabel('Imaginary')
%
% Save the graph as a .jpg and place in working directory
saveas(gcf,'examplegraph.jpg','jpg');
5 Kommentare
Dennis
am 20 Mär. 2019
You only calculate the values of b and c for u=1. Maybe you want to change
%u=1;
u=1:50;
and
% c=c(1+u);
% b=b(u+1);
% x1com=(-b+sqrt(b^2-4*a.*c))/(2*a);
% x2com=(-b-sqrt(b^2-4*a.*c))/(2*a);
x1com=(-b(u)+sqrt(b(u)^2-4*a.*c(u)))/(2*a);
x2com=(-b(u)-sqrt(b(u)^2-4*a.*c(u)))/(2*a);
Antworten (1)
Krishna Zanwar
am 22 Mär. 2019
In the code above 'b' and 'c' are scalars and cannot be indexed. If you want to get an array of 'b' and 'c' as 'u' is increasing you sould put them inside the for loop.
b(u)=(2*M*(l_f^2*K_f+l_r^2*K_r)+2*I*(K_f+K_r))/M*u*I;
c(u)=((4*K_f*K_r*l_wb^2)/(M*I*u^2))-(2*(l_f*K_f-l_r*K_r)/I);
x1com=(-b(u)+sqrt(b(u)^2-4*a*c(u)))/(2*a);
x2com=(-b(u)-sqrt(b(u)^2-4*a*c(u)))/(2*a);
0 Kommentare
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!