How to correct ''Function definitions are not permitted in this context.''
조회 수: 3 (최근 30일)
이전 댓글 표시
I am trying to solve an optimization problem with multi objective genetic algorithms and I am having this error even I stored the file as (multiobj.m). Thanks in advance.
clear all
clc
%%given
D=0.1;
W=10e3;
ns=40;
x(3)=0.005;
x(1)=100e-6;
x(2)=0.4;
row=860;
Cp=4.19*10^3;
%%the average Reynolds number
U=pi*D*ns;
Re=(row*x(1)*U)/x(3);
%%the correction coefficients
if (Re<510)
alpha=1;
G=1/12;
elseif (510<=Re<1125)
alpha=5.914*Re^(-0.285);
G=2.915*Re^(-0.57);
elseif (1125<=Re<13500)
alpha=0.798;
G=2.915*Re^(-0.57);
else
alpha=0.756;
G=14.45*Re^(-0.75);
end
%%modified Sommerfield number
S=(ns*x(3)*(D^3)*x(2))/(48*G*(x(1)^2)*W);
%%the eccentricity ratio
epsilon=exp(-2.236*alpha*x(2)*sqrt(S));
%%the maximum film pressure
theta=1/(cos((1-sqrt(1+24*epsilon^(2)))/(4*epsilon)));
Pmax=((pi*ns*x(3)*D^(2)*alpha^(2)*x(2)^(2))/(8*G*x(1)^(2)))*((epsilon*sin(theta))/((1+epsilon*cos(theta))^(3)));
%%the friction force on the journal surface
if (Re<1125)
Fj=((pi^(2)*x(3)*ns*D^(3)*x(2))/(48*G*x(1)))*((1/sqrt(1-epsilon))+((1-epsilon)/(1-epsilon^(2))^(3/2)));
elseif (1125<=Re<13500)
Fj=((pi^(2)*x(3)*ns*D^(3)*x(2))/(48*G*x(1)))*((1.109*epsilon^(2))-(1.49*epsilon)+2.748);
else Fj=((pi^(2)*x(3)*ns*D^(3)*x(2))/(48*G*x(1)))*((1.792*epsilon^(3))-(1.523*epsilon^(2))-(3.697*epsilon)+8.734);
end
lb=[40e-6;0.2;0.0001];
ub=[300e-6;0.6;0.001];
A=[-1 0 0;1 0 0;0 -1 0;0 1 0;0 0 -1;0 0 1];
b=[-40e-6;300e-6;-0.2;0.6;-0.0001;0.001];
nvars=3;
function f=multiobj(x)
f(1)=(pi/4)*ns*x(1)*D^(2)*epsilon;
f(2)=(2*Fj)/(row*Cp*D*x(1)*epsilon);
end
[x,f,exitflag,output]=gamultiobj(@multiobj,nvars,A,b,[],[],lb,ub)
댓글 수: 0
채택된 답변
Jan
2017년 12월 18일
편집: Jan
2017년 12월 19일
You can copy the complete code to a function:
[EDITED] Parameters added to multiobj():
function [x,f,exitflag,output] = yourFcn
% clear all % Omit this waste of time
clc
%%given
D=0.1;
... % Left out due to clarity
nvars=3;
fcn = @(x) multiobj(x, ns, D, epsilon, row, CP, Fj);
[x, f, exitflag, output] = gamultiobj(fcn,nvars,A,b,[],[],lb,ub)
end
function f = multiobj(x, ns, D, epsilon, row, CP, Fj)
f(1) = (pi/4) * ns * x(1)* D^(2) * epsilon;
f(2) = (2*Fj) / (row * Cp * D * x(1) * epsilon);
end
In modern Matlab versions functions can be defined in scripts also, but not in the middle of it. But using functions is much better, because it keeps the workspace clear and you can omit the darn clear all.
댓글 수: 7
추가 답변 (2개)
Image Analyst
2017년 12월 18일
The last line, about gamultiobj(), is not in any function. So you have a function right in the middle of a script, which is not allowed. Also, what release do you have, since it was about R2016b or so where they allowed functions to follow scripts in a file?
댓글 수: 4
Image Analyst
2017년 12월 19일
편집: Image Analyst
2017년 12월 19일
Or call your m-file something like testga.m, and then put this line as the first line in your file
function testga()
Then follow with the rest of your code and other function. The line
[x,f,exitflag,output]=gamultiobj(@multiobj,nvars,A,b,[],[],lb,ub)
will have to go inside one of the functions. Since you ended multiobj() with "end", you'll also have to end testga() with an "end".
Actually, all of this is done in Jan's answer, so just follow that.
Alan Weiss
2017년 12월 18일
편집: Alan Weiss
2017년 12월 18일
If I understand you correctly, you stored that whole file as multiobj.m. Instead, just store this as multiobj.m:
function f=multiobj(x)
f(1)=(pi/4)*ns*x(1)*D^(2)*epsilon;
f(2)=(2*Fj)/(row*Cp*D*x(1)*epsilon);
end
Take those lines out of your code. Store your code (without those lines) as a separate file, maybe runmultiobj.m.
Calling runmultiobj won't run because you are passing extra parameters. Rework things to make this a nested function, or add more arguments to multiobj and call it as @(x)multiobj(x,ns,D,row,epsilon) or whatever you need to pass.
Alan Weiss
MATLAB mathematical toolbox documentation
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!