Index exceeds number of array elements (1)?
278 ビュー (過去 30 日間)
古いコメントを表示
dt = 0.005; N = 200; %(s)
P3s = 2; P3d = 23.5; %(mmHg)
V2(1) = .475; %(L)
V0 = .06; %(L)
C2 = 0.05; %(L/mmHg)
R1 = 30; R2 = 30; %(mmHg*s/L)
P1 = 11; %(mmHg)
P3(1:120) = P3s;
P3(121:200) = P3d;
t = 0:dt:(N-1)*dt;
plot(t, P3)
xlabel('Time (s)'), ylabel('Pressure (mmHg)')
for i = 1:N
P2(i) = (V2(i) - V0) / C2;
if P2(i) > P3(i); Q3(i) = (P2(i) - P3(i)) / R2;
else Q3(i) = 0;
end
Q1(i) = (P1 - P2(i)) / R1;
Q2(i) = Q1(i) - Q3(i);
P2(i+1) = P2(i) + Q2(i)*dt;
end
tp = 0:dt:N*dt;
figure
plot(tp, P2)
xlabel('Time (s)'), ylabel('P2 (mmHg)')
Error is in line 12 " P2(i) = (V2(i) - V0) / C2;"
What is strange about this problem is that the code runs perfectly on my computer, but when transferred to another and ran, it gives the error message. Any ideas?
1 件のコメント
Mark Linne
2021 年 7 月 30 日
I have two nested loops:
for i=1:1:NJ
for f=1:1:NJ
Later in the script I need to do a for loop using:
for L=abs(i-f):1:(i+f)
For obvious reasons, the (i+f) generates the error under discussion. Is there a known way to work around this issue (written by a dinosaur who learned Fortran in 1970, still thinks that way, and would prefer to be able to set array sizes myself at the start of the code)?
採用された回答
Aquatris
2018 年 11 月 6 日
編集済み: Aquatris
2018 年 11 月 6 日
You only define V2(1) in your code and do not increase the size of the V2 variable. So I think you are missing a code in your for loop which assigns values to V2(i+1).
It probably runs in your computer because your workspace includes a V2 variable with correct size from another script so the code does not yell at you.
4 件のコメント
Aquatris
2019 年 3 月 13 日
In his code he never defined V2(2) so he added a line in his for loop, something like;
for i = 1:N
...
V2(i+1) = *equation*
end
その他の回答 (9 件)
sura naji
2020 年 2 月 18 日
clc
clear
close all
% Problem Statement
Npar = 17;
VarLow=0.1;
VarHigh = 35;
%BBBC parameters
N=50; %number of candidates
MaxIter=100; %number of iterations
% initialize a random value as best value
XBest = rand(1,Npar).* (VarHigh - VarLow) + VarLow;
FBest=fitnessFunc(XBest);
GB=FBest;
t = cputime;
%intialize solutions and memory
X = zeros(N, Npar);
F = zeros(N, 1);
for ii = 1:N
X(ii,:) = rand(1,Npar).* (VarHigh - VarLow) + VarLow;
% calculate the fitness of solutions
F(ii) = fitnessFunc(X(ii,:));
end
%Main Loop
for it=1:MaxIter
%Find the centre of mass
%-----------------------
%numerator term
num=zeros(1,Npar);
for ii=1:N
for jj=1:Npar
num(jj)=num(jj)+(X(ii,jj)/F(ii));
end
end
%denominator term
den=sum(1./F);
%centre of mass
Xc=num/den;
%generate new solutions
%----------------------
for ii=1:N
%new solution from centre of mass
for jj=2:Npar
New=X(ii,:);
New(jj)=Xc(jj)+((VarHigh(jj)*rand)/it^2);
end
%boundary constraints
New=limiter(New,VarHigh,VarLow);
%new fitness
newFit=fitnessFunc(New);
%check whether the solution is better than previous solution
if newFit<F(ii)
X(ii,:)=New;
F(ii)=newFit;
if F(ii)<FBest
XBest=X(ii,:);
FBest=F(ii);
end
end
end
% store the best value in each iteration
GB=[GB FBest];
end
%Main Loop
for it=1:MaxIter
%Find the centre of mass
%-----------------------
%numerator term
num=zeros(1,Npar);
for ii=1:N
for jj=1:Npar
num(jj)=num(jj)+(X(ii,jj)/F(ii));
end
end
%denominator term
den=sum(1./F);
%centre of mass
Xc=num/den;
%generate new solutions
%----------------------
for ii=1:N
%new solution from centre of mass
for jj=2:Npar
New=X(ii,:);
New(jj)=Xc(jj)+((VarHigh(jj)*rand)/it^2);
end
hi please can you help me because l have the same problem and the message related to [ New(jj)=Xc(jj)+((VarHigh(jj)*rand)/it^2);] [index exceeds number of array element(1)]?
1 件のコメント
BAMIDELE JEGEDE
2020 年 5 月 31 日
編集済み: Walter Roberson
2021 年 6 月 4 日
I have the issue with my code
clear, clc
x = 0:0.01:pi
y = myfunc(x)
plot(x,y)
avg_y = y(1:length(x)-1) + diff(y)/2;
A = sum(diff(x).*avg_yin )
at
avg_y = y(1:length(x)-1) + diff(y)/2;
I honestly don't know what I am doing wrong and it's becoming frustrating
3 件のコメント
Farshid R
2020 年 12 月 22 日
編集済み: Farshid R
2020 年 12 月 22 日
Hi
Good time
I wrote this code but it gives an error
Please help me
thank you
n=100;
u1=[0,0]';
X1=[-4,-2,0]';
% p=data.PredictionHorizon;
a=0.9;h=0.9;
cp1=1;cp2=1;cp3=1;
% c1=0;c2=0;c3=0;
for j=1:n
c1(j)=(1-(1+a)/j)*cp1;
c2(j)=(1-(1+a)/j)*cp2;
c3(j)=(1-(1+a)/j)*cp3;
cp1=c1(j); cp2=c2(j); cp3=c3(j);
end
% initial conditions setting:
v1(1)=u1(1);
w1(1)=u1(2);
x1(1)=X1(1); y1(1)=X1(2); z1(1)=X1(3);
% calculation of phase portraits /numerical solution/:
for i=2:n
x1(i)=h*cos(z1(i-1))*v1(i-1) - memo(x1, c1, i);
y1(i)=h*sin(z1(i-1))*v1(i-1)-memo(y1, c2, i);
z1(i)=h*w1(i-1)-memo(z1, c3, i) ;
end
%%
function [yo] = memo(r, c, k)
%
temp = 0;
for j=1:k-1
temp = temp + c(j)*r(k-j);
end
yo = temp;
%
%%%%% error
Index exceeds the number of array elements (1).
Error in exocstrstateFcnCT1 (line 28)
x1(i)=h*cos(z1(i-1))*v1(i-1) - memo(x1, c1, i);
Walter Roberson
2021 年 2 月 12 日
v1(1)=u1(1);
You initialize one v1 value
for i=2:n
x1(i)=h*cos(z1(i-1))*v1(i-1) - memo(x1, c1, i);
When i = 3, you access v1(3-1) -> v1(2) . But that does not exist.
y1(i)=h*sin(z1(i-1))*v1(i-1)-memo(y1, c2, i);
z1(i)=h*w1(i-1)-memo(z1, c3, i) ;
end
You keep extending x1 and y1 and z1 in that loop, but you do not extend v1 or w1
Sara Babaie
2021 年 2 月 12 日
I need some help with my code...I am getting the same error:
format long
ep=0.8; %Radiative emissivity of the pipe surface
stfb=5.67e-08; %Stefan-Boltzmann constant
q=500; %heat rate
tair=270; %air temperature
tsurr=270; %surrounding temperature
h=10; %convective heat coefficient
d=0.1; %diameter of the pipe
L=0.5; %length of pipe
p=pi;
ft=@(t84)q-(p*d*L(h*(t84-tair)+(ep*stfb(t84^4-tsurr^4))))
a=ft(334)
3 件のコメント
Farshid R
2021 年 2 月 12 日
This error is related to the dimensions and the number of elements is more.
Walter Roberson
2021 年 2 月 12 日
In this case, Sara's error is in forgetting a multiplication symbol. stfb*(t84^4-tsurr^4)
Simon Hudon-Labonté
2021 年 3 月 9 日
function [xsol]=NewtonRaphson(Fon,DerFon,SolEst,Erreur,jmax)
iflag=0;
for j=1:jmax
xsoli=SolEst-(Fon(SolEst)/DerFon(SolEst));
if abs((xsoli-SolEst)/SolEst)<Erreur
xsol=xsoli;
iflag=1;
break
end
SolEst=xsoli;
end
if j==jmax && iflag~=1
fprintf('Aucune solution après %i itérations.\n',jmax)
xsol=('Aucune réponse');
end
Hello i am getting the same error as the others in the comment but even with the different answers I cannot find my error. Thank you!
Simon
4 件のコメント
Binyam Sime
2021 年 6 月 3 日
Hello!!
I need some little correction (If any) for the code blow!
If any one help me, i have a greate gratittude!!!!!
A = imread('C:\Users\pc_2\Desktop\bs\Im_one.jpg');
r=size(A,1);
c=size(A,2);
A=double(A);
ah= uint8(zeros(r,c));
n=r*c;
f=zeros(256,1);
pdf=zeros(256,1);
cdf=zeros(256,1);
cum=zeros(256,1);
out=zeros(256,1);
for i=1:r
for j=1:c
value =A(i,j);
f(value+1)=f(value+1)+1;
pdf(value+1) =f(value+1)/n;
end
end
sum=0;L=255;
for i=1:size(pdf)
sum =sum +freq(i);
cum(i)=sum;
cdf(i)=cum(i)/n;
out(i) =round(cdf(i)*L);
end
for i=1:r
for j=1:c
ah(i,j)= out(A(i,j)+1);
end
end
figure,imshow(ah);
he= histeq(A);
figure,imshow(he);
when run it says as follws:-
Index exceeds the number of array elements (1).
Thank you for your help!
Walter Roberson
2021 年 6 月 3 日
sum =sum +freq(i);
You do not define freq() in the code.
Wu Changjin Wu
2021 年 6 月 4 日
can some one help me, I got the same error !
% Read in image.
grayImage = imread('FFT.JPG');
[rows, columns, numberOfColorChannels] = size(grayImage)
if numberOfColorChannels > 1
grayImage = rgb2gray(grayImage);
end
% Display original grayscale image.
subplot(2, 3, 1);
imshow(grayImage)
axis on;
title('Original Gray Scale Image', 'FontSize', fontSize)
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Perform 2D FFTs
fftOriginal = fft2(double(grayImage));
% Move center from (1,1) to (129, 129) (the middle of the matrix).
shiftedFFT = fftshift(fftOriginal);
subplot(2, 3, 2);
scaledFFTr = 255 * mat2gray(real(shiftedFFT));
imshow(log(scaledFFTr), []);
title('Log of Real Part of Spectrum', 'FontSize', fontSize)
subplot(2, 3, 3);
scaledFFTi = mat2gray(imag(shiftedFFT));
imshow(log(scaledFFTi), []);
axis on;
title('Log of Imaginary Part of Spectrum', 'FontSize', fontSize)
% Display magnitude and phase of 2D FFTs
subplot(2, 3, 4);
shiftedFFTMagnitude = abs(shiftedFFT);
imshow(log(abs(shiftedFFTMagnitude)),[]);
axis on;
colormap gray
title('Log Magnitude of Spectrum', 'FontSize', fontSize)
% Get average
midRow = rows/2+1
midCol = columns/2+1
maxRadius = ceil(sqrt(129^2 + 129^2))
radialProfile = zeros(maxRadius, 1);
count = zeros(maxRadius, 1);
for col = 1 : columns
for row = 1 : rows
radius = sqrt((row - midRow) ^ 2 + (col - midCol) ^ 2);
thisIndex = ceil(radius) + 1;
radialProfile(thisIndex) = radialProfile(thisIndex) + shiftedFFTMagnitude(row, col);
count(thisIndex) = count(thisIndex) + 1;
end
end
radialProfile = radialProfile./ count;
subplot(2, 3, 5:6);
plot(radialProfile, 'b-', 'LineWidth', 2);
grid on;
title('Average Radial Profile of Spectrum', 'FontSize', fontSize)
1 件のコメント
Walter Roberson
2021 年 6 月 4 日
fontSize = 12;
% Read in image.
filename = 'FFT.JPG';
if isunix()
filename = 'flamingos.jpg';
end
grayImage = imread(filename);
[rows, columns, numberOfColorChannels] = size(grayImage);
if numberOfColorChannels > 1
grayImage = rgb2gray(grayImage);
end
% Display original grayscale image.
subplot(2, 3, 1);
imshow(grayImage)
axis on;
title('Original Gray Scale Image', 'FontSize', fontSize)
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Perform 2D FFTs
fftOriginal = fft2(double(grayImage));
% Move center from (1,1) to (129, 129) (the middle of the matrix).
shiftedFFT = fftshift(fftOriginal);
subplot(2, 3, 2);
scaledFFTr = 255 * mat2gray(real(shiftedFFT));
imshow(log(scaledFFTr), []);
title('Log of Real Part of Spectrum', 'FontSize', fontSize)
subplot(2, 3, 3);
scaledFFTi = mat2gray(imag(shiftedFFT));
imshow(log(scaledFFTi), []);
axis on;
title('Log of Imaginary Part of Spectrum', 'FontSize', fontSize)
% Display magnitude and phase of 2D FFTs
subplot(2, 3, 4);
shiftedFFTMagnitude = abs(shiftedFFT);
imshow(log(abs(shiftedFFTMagnitude)),[]);
axis on;
colormap gray
title('Log Magnitude of Spectrum', 'FontSize', fontSize)
% Get average
midRow = rows/2+1;
midCol = columns/2+1;
%maxRadius = ceil(sqrt(129^2 + 129^2))
maxRadius = ceil(sqrt(midRow.^2 + midCol.^2));
radialProfile = zeros(maxRadius, 1);
count = zeros(maxRadius, 1);
for col = 1 : columns
for row = 1 : rows
radius = sqrt((row - midRow) ^ 2 + (col - midCol) ^ 2);
thisIndex = ceil(radius) + 1;
radialProfile(thisIndex) = radialProfile(thisIndex) + shiftedFFTMagnitude(row, col);
count(thisIndex) = count(thisIndex) + 1;
end
end
radialProfile = radialProfile./ count;
subplot(2, 3, 5:6);
plot(radialProfile, 'b-', 'LineWidth', 2);
grid on;
title('Average Radial Profile of Spectrum', 'FontSize', fontSize)
ELIZABETH ESPARZA
2021 年 6 月 5 日
Hi, i have the same error, i need help :(
clear all
%incremento en x
h=0.1;
%funcion 1
f = @(t,a,b,u,v,w) -5*a*u+2*a-4*b;
%funcion 2
g = @(t,a,b,u,v,w) -a*b*v-a+6*b;
%funcion 3
d = @(t,a,b,u,v,w) b*w-a;
%Condiciones Iniciales
ti = 0;
ai = 0;
bi = 0;
ui = 0;
vi = 0;
wi = 00;
%Iteraciones
n = 5;
%Función
[t,a,b,u,v,w] =RungeFG3(f,g,d,n,h,ti,ai,bi,ui,vi,wi)
%Graficación
plot3(t,a,b);grid on;
legend('Runge K4')
title('Gráfica')
xlabel('t')
ylabel('a')
zlabel('b')
tabla1= table (t',a',b');
tabla1.Properties.VariableNames = {'t','a','b'}
function [t,a,b,u,v,w] =RungeFG3(f,g,d,n,h,t0,a0,b0,u0,v0,w0)
t(1) = t0;
a(1) = a0;
b(1) = b0;
u(1) = u0;
v(1) = v0;
w(1) = w0;
for i=1:1:n
t(i+1) = t(i) + h;
k1 = h*f(t(i),a(i),b(i),u(i),v(i),w(i));
l1 = h*g(t(i),a(i),b(i),u(i),v(i),w(i));
e1 = h*d(t(i),a(i),b(i),u(i),v(i),w(i));
m1 = h*u(i);
n1 = h*v(i);
p1 = h*w(i);
k2 = h*f(t(i)+h/2,a(i)+m1/2,b(i)+n1/2,u(1)+k1/2,v(i)+l1/2,w(i)+l1/2);
l2 = h*g(t(i)+h/2,a(i)+m1/2,b(i)+n1/2,u(1)+k1/2,v(i)+l1/2,w(i)+l1/2);
e2 = h*d(t(i)+h/2,a(i)+m1/2,b(i)m2 = h*(u(i)+k1/2);
n2 = h*(v(i)+l1/2);
p2 = h*(w(i)+p1/2);
k3 = h*f(t(i)+h/2,a(i)+m2/2,b(i)+n2/2,u(1)+k2/2,v(i)+l2/2,w(i)+l2/2);
l3 = h*g(t(i)+h/2,a(i)+m2/2,b(i)+n2/2,u(1)+k2/2,v(i)+l2/2,w(i)+l2/2);
e3 = h*d(t(i)+h/2,a(i)+m2/2,b(i)+n2/2,u(1)+k2/2,v(i)+l2/2,w(i)+l2/2);
m3 = h*(u(i)+k2/2);
n3 = h*(v(i)+l2/2);
p3 = h*(w(i)+p2/2);
k4 = h*f(t(i)+h,a(i)+m3,b(i)+n3,u(1)+k3,v(i)+l3,w(i)+l3);
l4 = h*g(t(i)+h,a(i)+m3,b(i)+n3,u(1)+k3,v(i)+l3,w(i)+l3);
e4 = h*d(t(i)+h,a(i)+m3,b(i)+n3,u(1)+k3,v(i)+l3,w(i)+l3);
m4 = h*(u(i)+k3);
n4 = h*(v(i)+l3);
p4 = h*(w(i)+p3);
u(i+1) = u(i)+(k1+2*k2+2*k3+k4)/6;
v(i+1) = v(i)+(l1+2*l2+2*l3+l4)/6;
p(i+1) = w(i)+(p1+2*p2+2*p3+p4)/6;+n1/2,u(1)+k1/2,v(i)+l1/2,w(i)+l1/2);
a(i+1) = a(i)+(m1+2*m2+2*m3+m4)/6;
b(i+1) = b(i)+(n1+2*n2+2*n3+n4)/6;
end
end
5 件のコメント
Aquatris
2021 年 6 月 6 日
That index problem happens because of variable w. You never assigned values to w(i+1) in your code.
emre bahçeci
2021 年 6 月 15 日
Hello,i am trying to face same error.Here is my code:
T=1.5
t=0:0.001:T
m=1;b=10;k=100;
K=[1 0 0 0 0 0;
0 1 0 0 0 0;
0 0 2 0 0 0;
1 T T^2 T^3 T^4 T^5;
0 1 2*T 3*T^2 4*T^3 5*T^4;
0 0 2 6*T 12*T^2 20*T^3]
A=inv(K)*[pi/3;0;0;5*pi/3;0;0]
syms theta(x)
theta_dot=diff(theta,x)
theta_dot_dot=diff(theta_dot,x)
Q=m*theta_dot_dot+b*theta_dot+k*theta
for i=1:length(t)
teta(i)=A(1)+A(2)*t(i)+A(3)*t(i)^2+A(4)*t(i)^3+A(5)*t(i)^4+A(6)*t(i)^5
tetah(i)=A(2)+2*A(3)*t(i)+3*A(4)*t(i)^2+4*A(5)*t(i)^3+5*A(6)*t(i)^4
tetai(i)=2*A(3)+6*A(4)*t(i)+12*A(5)*t(i)^2+20*A(6)*t(i)^3
Q_new(i)=subs(Q,[theta_dot_dot theta_dot theta],[tetai tetah teta])
end
After that i have encountered same error:
Index exceeds the number of array elements (1).
Error in sym/subs>normalize (line 212)
Y{i} = fun2sym(Y{i},argnames(X{i}));
Error in sym/subs>mupadsubs (line 166)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok
Error in sym/subs (line 154)
G = mupadsubs(F,X,Y);
Error in symbolic_in_for_loop (line 19)
Q_new(i)=subs(Q,[theta_dot_dot theta_dot theta],[tetai tetah teta])
Can anybody help me?
Thanks
2 件のコメント
Walter Roberson
2021 年 6 月 15 日
I had to make T smaller for demonstration purposes
format long g
T=.015;
t=0:0.001:T;
m=1;b=10;k=100;
K=[1 0 0 0 0 0;
0 1 0 0 0 0;
0 0 2 0 0 0;
1 T T^2 T^3 T^4 T^5;
0 1 2*T 3*T^2 4*T^3 5*T^4;
0 0 2 6*T 12*T^2 20*T^3]
A=inv(K)*[pi/3;0;0;5*pi/3;0;0]
syms theta(x)
theta_dot=diff(theta,x)
theta_dot_dot=diff(theta_dot,x)
Q=m*theta_dot_dot+b*theta_dot+k*theta
for i=1:length(t)
teta(i)=A(1)+A(2)*t(i)+A(3)*t(i)^2+A(4)*t(i)^3+A(5)*t(i)^4+A(6)*t(i)^5;
tetah(i)=A(2)+2*A(3)*t(i)+3*A(4)*t(i)^2+4*A(5)*t(i)^3+5*A(6)*t(i)^4;
tetai(i)=2*A(3)+6*A(4)*t(i)+12*A(5)*t(i)^2+20*A(6)*t(i)^3;
Q_new(i,1)=subs(Q(x),{theta_dot_dot theta_dot theta},{tetai(i) tetah(i) teta(i)});
end
Q_new
Anastasiya Moiseeva
2023 年 3 月 23 日
編集済み: Anastasiya Moiseeva
2023 年 3 月 23 日
Please, can someone help me?
I got the same error in my m-file
Error in file (line 16)
yp = simout(b)
% Data
u1 = 40;
u2 = 60;
u = 50;
y1 = 0;
y2 = 60;
y3 = 40;
mui1 = 0;
mui2 = 100;
time1 = 0;
%Calculate parameters
% inflection point
[a, b] = max(yout)
tp = tout(b)
% simout = round(simout) % rounding function
yp = simout(b)
% Time time2
d = find(simout==60)
time2 = tout(d)
% Time time3
e = find(simout==40)
time3 = tout(e)
%Square Sy2
u = -yout(e)
Sy2 = ((u1-y1)*(u1-y1))/u
%Square Sy1
Sy1 = ((sum(simout))*1.65) %/ it is necessary to change the scale in simout
Smui = (mui2-mui1)*(time2-time1)
%Find Коб
Kob = (Sy1+Sy2)/Smui
%Find b
b = (yp-y1)/(Kob*(mui2-mui1))
% Find x
if (b < 0.14)
c1 = 0.2604;
c2 = -0.07986;
c3 = -0.0203;
x = c2+c3/(b-c1)
elseif (0.14 <= b) && (b < 0.26)
c1 = 0.2993;
c2 = -0.1076;
c3 = -0.03128;
x = c2+c3/(b-c1)
else
x = 0.6881
end
% Find z
z = x^(x/(1-x))
% Find Tob
Tob = (Kob*(mui2-mui1))/a
% Find the parameters of the object model (time constants ... object models
Tmob2 = z*Tob
Tmob1 = x*Tmob2
taumob = tp-Tmob2*[-log(z)]
%Object Model Parameters
taumob = taumob;
Tmob1 = Tmob1;
Tmob2 = Tmob2;
Kmob = Kob;
M = 1.4;
%
%Values .......................Rrs.op....Frs.op.........
Rs.op = 1.4; %sqrt(b^2 + c^2) 1.3
Gs.op = -90; %atand(-c/b)
Fs.op = Gs.op*pi/180
Ws.op = Rs.op*exp(j*Fs.op)
%====-----------------------
Wrs.op = Ws.op/(1-Ws.op)
%====Wrs.o
%aa = real(Wrs.op)
%bb = imag(Wrs.op)
Rrs.op = abs(Wrs.op)
Frs.op = angle(Wrs.op)
%---------------------------------------
%Determination of the optimal values of the aprha parameters *****
n = Tmob2/Tmob1
beta = taumob/Tmob1
a01 = -4;
b01 = 0.38;
c01 = 0.2;
a16 = -3.714286;
b16 = 0.1817143;
c16 = 0.5576327;
az4 = -0.2613139;
bz4 = 0.2176277;
cz4 = 0.0677002;
y01 = b01 + (c01/(n-a01));
y16 = b16 + (c16/(n-a16));
z4 = bz4 + (cz4/(beta-az4));
bbb = -6.622517;
ccc = -2.5821192;
d4 = bbb*z4 -ccc;
d4 = bbb*z4 - ccc;
anpha = y01*(1-d4)+y16*d4
%Determination of optimal parameter values ТТi.op ****
a011 = -0.10738;
b011 = 1.25235;
c011 = 0.60646;
a161 = -2.20225;
b161 = 1.60899;
c161 = 8.93751;
az41 = -1.4;
bz41 = 4.7;
cz41 = -4.95;
bbb1 = 0.60606;
ccc1 = 0.84848;
y011 = b011 + (c011/(n-a011));
y161 = b161 + (c161/(n-a161));
z41 = bz41 + (cz41/(beta - az41));
d41 = bbb1*z41 - ccc1;
TTi.op = y011*(1-d41) + y161*d41
%----------------------------------------
Kf = 8;
a_Ti = 2*pi/TTi.op;
a_Td = a_Ti*anpha;
a_Tf = a_Td/Kf;
Wf_op = 1/((j*a_Tf + 1)*(j*a_Tf + 1));
Rf_op = abs(Wf_op)
Ff_op = angle(Wf_op)
Wr_op = 1 + (1/(j*a_Ti)) + j*a_Td*Wf_op;
Rr.op = abs(Wr_op)
Fr.op = angle(Wr_op)
Fob.op = Frs.op
% The optimal value of the dimensionless frequency is determined
x1 = 1.5;
Gx = beta*x1 + atan(x1) + atan(x1*n) + Fob.op;
GGx = beta + 1/(x1^2 +1) + n/((n^2)*(x1^2) +1);
finish = abs(Gx/GGx);
for i = 1:100
if (finish >= 0.01)
x1 = x1 - Gx/GGx;
Gx = beta*x1 + atan(x1) + atan(x1*n) + Fob.op;
GGx = beta + 1/(x1^2 +1) + n/((n^2)*(x1^2) +1);
finish = abs(Gx/GGx);
else
x0 = x1;
Om_op = x1
break
end
i = i+1;
end
Ks.op = (Rrs.op*sqrt((Om_op^2 + 1)*((Om_op^2)*n^2 + 1)))/Rr.op
Kr.op = Ks.op/Kmob
T0 = (Tmob1*2*pi)/Om_op;
Ti.op = T0/TTi.op
Td = Ti.op*anpha
%-Controller Parameters
Kp = Kr.op
Ki = Kp/Ti.op
Kd = Kp*Td
Tf = Td/Kf
%----------------------------------------
1 件のコメント
Walter Roberson
2023 年 3 月 23 日
simout is not defined in your code. If you assigned
simout = sim(SOME Simulink stuff)
then you probably configured Simulink to return "unified" output, which is a scalar struct with fields named after the variables being returned.
labtst
2024 年 1 月 3 日
Index exceeds the number of
array elements (1).
Error in Trajectory/show (line
73)
carPositionOnCenterline =
obj.nearest_points(car_states(1),
car_states(2));
Error in Main (line 78)
myTrajectory.show(Lambo,
file_path)
>>
5 件のコメント
Walter Roberson
2024 年 1 月 3 日
car_states = Car.state_unpack();
but state_unpack is defined as returning up to four parts, starting with x and then y.
You then proceed to index car_states, which is equivalent to indexing the returned x. Do we have solid reason to expect that the x will always have at least two components?
labtst
2024 年 1 月 7 日
移動済み: DGM
2024 年 1 月 8 日
bitte ich hätte gerne diesen PID-Regler für alle Stecke implimentieren und optimieren. können Sie mir bitte helfen?
classdef Car<handle
properties
% States of the Model
states; % [x,y,phi,velocity]
augmented_states;
control_inputs; %[steering_angle, acceleration]
% Geometry of the car
track=2057/1000; %meter
wheel_base=2665/1000; %meter
wheel_diameter=66.294/100;
wheel_width=25.908/100;
%Time step for the simulation
ts=0.05;
% Model limits
%steering_angle_limit = deg2rad(33.75);
steering_angle_limit = deg2rad(60.75);
max_velocity = 40.3488; % m/s
%max_velocity = 98.3488; % m/s
% PID Errors
old_cte;
cte_intergral;
last_smoothed_inputs = [0 0]
max_acceleration = 6.0;
end
methods
%% Constructor
function obj=Car(states,control_inputs)
% Check not to exceed the maximum velocity.
if (states(4) > obj.max_velocity)
states(4)= obj.max_velocity;
end
obj.states=states;
% Normalize the steering angle to be between -pi and +pi.
control_inputs(1) = atan2(sin(control_inputs(1)),cos(control_inputs(1)));
% Check that the steering angle is not exceeding the limit.
if (control_inputs(1) > obj.steering_angle_limit)
control_inputs(1) = obj.steering_angle_limit;
elseif (control_inputs(1) < -obj.steering_angle_limit)
control_inputs(1) = -obj.steering_angle_limit;
end
obj.control_inputs=control_inputs;
obj.old_cte = 0;
obj.cte_intergral = 0;
end
%% Plot My car
function show(obj)
%Plot the Body of the Car
pc1=[-obj.wheel_base/2;obj.track/2;1];
pc2=[obj.wheel_base/2;obj.track/2;1];
pc3=[obj.wheel_base/2;-obj.track/2;1];
pc4=[-obj.wheel_base/2;-obj.track/2;1];
pc=[pc1 pc2 pc3 pc4];
pw1=[-obj.wheel_diameter/2;obj.wheel_width/2;1];
pw2=[obj.wheel_diameter/2;obj.wheel_width/2;1];
pw3=[obj.wheel_diameter/2;-obj.wheel_width/2;1];
pw4=[-obj.wheel_diameter/2;-obj.wheel_width/2;1];
pwheel=[pw1 pw2 pw3 pw4];
[x,y,~,~]=state_unpack(obj);
%Plot the center of the car
plot(x,y,'o','Markersize',10,'Markerface','b')
hold on
R_car_world=carf_to_wf(obj);
pcw=R_car_world*pc;
plot([pcw(1,1) pcw(1,2)],[pcw(2,1) pcw(2,2)],'b','Linewidth',2)
plot([pcw(1,2) pcw(1,3)],[pcw(2,2) pcw(2,3)],'b','Linewidth',2)
plot([pcw(1,3) pcw(1,4)],[pcw(2,3) pcw(2,4)],'b','Linewidth',2)
plot([pcw(1,4) pcw(1,1)],[pcw(2,4) pcw(2,1)],'b','Linewidth',2)
%plot the Back wheels
%Plot the Front wheels
[si,~]=control_inputs_unpack(obj);
for i=2:3
R_wheel_to_car=wheel_frame_to_car(pc(:,i),si);
pwheel=R_car_world*R_wheel_to_car*pwheel;
plot([pwheel(1,1) pwheel(1,2)],[pwheel(2,1) pwheel(2,2)],'Color','red','Linewidth',2)
plot([pwheel(1,2) pwheel(1,3)],[pwheel(2,2) pwheel(2,3)],'Color','red','Linewidth',2)
plot([pwheel(1,3) pwheel(1,4)],[pwheel(2,3) pwheel(2,4)],'Color','red','Linewidth',2)
plot([pwheel(1,4) pwheel(1,1)],[pwheel(2,4) pwheel(2,1)],'Color','red','Linewidth',2)
pwheel=[pw1 pw2 pw3 pw4];
end
for i=1:3:4
R_wheel_to_car=wheel_frame_to_car(pc(:,i),0);
pwheel=R_car_world*R_wheel_to_car*pwheel;
plot([pwheel(1,1) pwheel(1,2)],[pwheel(2,1) pwheel(2,2)],'Color','red','Linewidth',2)
plot([pwheel(1,2) pwheel(1,3)],[pwheel(2,2) pwheel(2,3)],'Color','red','Linewidth',2)
plot([pwheel(1,3) pwheel(1,4)],[pwheel(2,3) pwheel(2,4)],'Color','red','Linewidth',2)
plot([pwheel(1,4) pwheel(1,1)],[pwheel(2,4) pwheel(2,1)],'Color','red','Linewidth',2)
pwheel=[pw1 pw2 pw3 pw4];
end
set(gca,'units','centimeters')
hold off
end
%% Get the transfomration matrix from car coordinate system to world coordinate system.
function R=carf_to_wf(obj)
[x,y,phi,~]=state_unpack(obj);
R=[cos(phi) -sin(phi) x;sin(phi) cos(phi) y;0 0 1];
end
%% Unpack the states
function [x,y,phi,v]=state_unpack(obj)
x=obj.states(1);
y=obj.states(2);
phi=obj.states(3);
v=obj.states(4);
end
%% Unpack control_inputs
function [si,acc]=control_inputs_unpack(obj)
si=obj.control_inputs(1);
acc=obj.control_inputs(2);
end
%% The dynamics of the car
% This function predicts the next state of the car based on its
% current state and the control inputs
function obj=update_state(obj)
[x,y,phi,v] = state_unpack(obj);
[si,acc] = control_inputs_unpack(obj);
x_next = x + v*cos(phi)*obj.ts;
y_next = y + v*sin(phi)*obj.ts;
phi_next = phi + v/(obj.wheel_base)*si*obj.ts;
v_next = v + acc*obj.ts;
% Check not the exceed the speed limit.
if(v_next > obj.max_velocity)
v_next = obj.max_velocity;
end
obj.states=[x_next y_next phi_next v_next];
end
%% A simple setter function. It is not necessary, but it will make the main code more readable.
function obj=update_input(obj,control_inputs)
% Normalize the steering angle to be between -pi and +pi.
control_inputs(1) = atan2(sin(control_inputs(1)),cos(control_inputs(1)));
% Check that the steering angle is not exceeding the limit.
if (control_inputs(1) > obj.steering_angle_limit)
control_inputs(1) = obj.steering_angle_limit;
elseif (control_inputs(1) < -obj.steering_angle_limit)
control_inputs(1) = -obj.steering_angle_limit;
end
obj.control_inputs=control_inputs;
end
function smooth_control_inputs(obj, smoothing_factor)
% Smooth control inputs using a simple low-pass filter
current_inputs = obj.control_inputs;
smoothed_inputs = smoothing_factor * current_inputs + (1 - smoothing_factor) * obj.last_smoothed_inputs;
obj.last_smoothed_inputs = smoothed_inputs;
obj.control_inputs = smoothed_inputs;
end
% function LateralLongitudinal_Controller(obj, cte, desired_yaw_rate)
% kp_lat = 0.03; % Parameter für laterale Regelung
% kd_lat = 0.3;
% ki_lat = 0.0001;
%
% kp_lon = 0.1; % Parameter für longitudinale Regelung
% kd_lon = 0.01;
% ki_lon = 0.0001;
%
% dcte = cte - obj.old_cte;
% obj.cte_intergral = obj.cte_intergral + cte;
% obj.old_cte = cte;
%
% % Lateral Control (quer)
% steering = kp_lat * cte + kd_lat * dcte + ki_lat * obj.cte_intergral;
%
% % Longitudinal Control (längs)
% desired_velocity = obj.max_velocity; % Setzen Sie die gewünschte Geschwindigkeit
% velocity_error = desired_velocity - obj.states(4);
%
% % Fügen Sie die max_acceleration-Eigenschaft hinzu
% max_acceleration = 2.0; % Setzen Sie hier den gewünschten maximalen Beschleunigungswert ein
%
% acceleration = kp_lon * velocity_error + kd_lon * obj.states(4) + ki_lon * sum(obj.states(1:4));
%
% % Begrenzen Sie die Beschleunigung
% acceleration = max(-max_acceleration, min(max_acceleration, acceleration));
%
% control_signal = [steering, acceleration];
%
% obj.update_input(control_signal);
% end
function PID_Controller(obj,cte)
kp = 0.08;
kd = 0.4;
ki = 0.000001;
dcte = cte - obj.old_cte;
obj.cte_intergral = obj.cte_intergral + cte;
obj.old_cte = cte;
steering = kp * cte + kd * dcte + ki * obj.cte_intergral;
[~,a] = obj.control_inputs_unpack;
control_signal = [steering,a];
obj.update_input(control_signal);
end
end
end
%% Helper Functions
function R=wheel_frame_to_car(pc,si)
R=[cos(si) -sin(si) pc(1);sin(si) cos(si) pc(2);0 0 1];
end
hier ist die trajectory classe:
classdef Trajectory < handle
properties
centerline;
nump = 8;
Nearst_Points;
Nearst_Points_C;
cte;
show_nearest = true;
show_fit = true;
Coeff_fit;
end
methods
function obj = Trajectory(file_path)
% Read Pylon data from file
pylons_data = readtable(file_path, 'Delimiter', ',', 'Format', '%s%f%f');
blue_pylons = pylons_data(strcmp(pylons_data.Var1, 'blue'), :);
yellow_pylons = pylons_data(strcmp(pylons_data.Var2, 'yellow'), :);
% Use pylons_data to generate centerline (replace this with your logic)
obj.centerline = generate_trajectory(pylons_data);
obj.Nearst_Points = zeros(obj.nump, 2);
obj.Nearst_Points_C = zeros(obj.nump, 2);
obj.cte = 0;
obj.Coeff_fit = [0 0 0];
end
function show(obj, Car)
% No need to read pylons_data from file since you're using centerline
% Überprüfen Sie, ob die Centerline leer oder gültig ist
if ~isempty(obj.centerline) && size(obj.centerline, 1) > 1
% Plot Centerline
plot(obj.centerline(:, 1), obj.centerline(:, 2), 'LineWidth', 1.5);
hold on;
else
% Die Centerline ist leer oder ungültig, geben Sie eine Warnung aus
warning('Die Centerline ist leer oder nicht korrekt zugewiesen.');
end
% Hier den Zustand des Autos abrufen und die Variable carPositionOnCenterline aktualisieren
Car_states = Car.state_unpack();
% Deine weiteren Berechnungen und Plots hier ...
hold off;
end
function W_to_Car_Coordinate_system(obj, Car)
[x, y, phi, ~] = Car.state_unpack;
tranlate = obj.Nearst_Points - [x, y];
obj.Nearst_Points_C = ([cos(phi) sin(phi); -sin(phi) cos(phi)] * tranlate')';
end
function find_nearest_points(obj, Car)
[x, y, ~, ~] = Car.state_unpack;
dist_list = sqrt((obj.centerline(:, 1) - x).^2 + (obj.centerline(:, 2) - y).^2);
[~, indices] = sort(dist_list);
obj.Nearst_Points = obj.centerline(indices(1:obj.nump), :);
end
function poly_fit(obj, Car)
obj.W_to_Car_Coordinate_system(Car);
obj.Coeff_fit = polyfit(obj.Nearst_Points_C(:, 1), obj.Nearst_Points_C(:, 2), 2);
end
function compute_error(obj)
obj.cte = obj.Coeff_fit(end);
end
end
end
% Transform points to car coordinate system
function CarPoints = CarToCarCoordinateSystem(WorldPoints, car)
[x, y, phi, ~] = car.state_unpack;
rotate = ([cos(phi), -sin(phi); sin(phi), cos(phi)] * WorldPoints')';
CarPoints = rotate + [x, y];
end
so dunktioniert der code:
参考
カテゴリ
Help Center および File Exchange で Delaunay Triangulation についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!