how to increase 'MaxFunEvals'

I want to increase 'maxFunEvals' in my program, but it doesn't work. What is the problem of my program?
clear all;
a = 0.2; %field loss coefficient α[db/km]
alfa = a*log(20)/20;
gamma = 1.3; % fiber non-linearity coefficient 
Ns = 20; %number of span
Ls = 100; %span length[km]
beta2 = 20.7; %dispersion coefficient[ps^2/km]
roll = 0.3; %roll-off of gwdm
%% formula of ρ
syms f f1 f2 real %f,f1,f2 is THz
Le = (1-exp(-2*alfa*Ls))/(2*alfa);
x1(f1,f2,f) = 1-exp(-2*alfa*Ls)*exp(4j*(pi^2)*(f1-f)*(f2-f)*beta2*Ls);%symfun
x2(f1,f2,f) = 2*alfa-(4j*(pi^2)*(f1-f)*(f2-f)*beta2);
p(f1,f2,f) = Le^(-2)*(abs(x1(f1,f2,f)/x2(f1,f2,f)))^2;
%% formula of Gwdm
syms t w k
T=1/(32e-3);
A = pi*t/T;
x(t)= (sin(A)/A)*(cos(roll*A)/(1-(2*roll*t/T)^2));
X(w) = simplify(fourier(rewrite(x(t),'exp'),t,w));
X(f) =X(2*sym(pi)*f);
X(f)= rewrite(abs(X(f)),'sqrt');
xfunc = matlabFunction(X(f));%@(f)
GWDM(f)= (symsum(xfunc(f+(50e-3)*k),k,-5,5)/((32/8.8)*T));
func = p*GWDM(f1)*GWDM(f2)*GWDM(f1+f2-f);
ft=matlabFunction(func);
%% formula of GNLI
pint = @(f)integral2(@(f1,f2)ft(f1,f2,f),-270.8e-3,270.8e-3,-270.8e-3,270.8e-3,'MaxFunEvals',20000);
NLI = @(f)(16/27).*Ns.^1.03.*gamma.^2.*Le.^2.*pint(f); % NLI
%f = -0.3:0.005:0.3;
%plot(f,arrayfun(@(f)NLI(f),f));
%hold on
%plot(f,GWDM(f));
%hold off

5 Comments

What do you mean exactly with 'doesn't work'? I formatted your code as code so it can be run in the editor, which didn't return an error.
Have a read here and here. It will greatly improve your chances of getting an answer.
Torsten
Torsten on 19 Dec 2022
Edited: Torsten on 19 Dec 2022
Look at the documentation.
AbsTol, RelTol and Method are the name-value arguments for "integral2". MaxFunEvals doesn't exist for "integral2".
I run my code and error message 'invalid name and value argument 'MaxFunEvals'. unrecognized name 'MaxFunEvals'. name must be 'AbsTol','RelTol' or 'Method'. ' displayed.
Your code does not demonstrate the error you are seeing, however, because you removed the lines that invoke pint
Sorry my program was wrong. if you fix formula of GNLI in my code as below, warning message 'you have reached the maxmum number of function evaluations(10000). the result didn't pass global error test.' will display. I think this warning can solve by increasing MaxFunEvals. but I can't increase the value.
pint = @(f)integral2(@(f1,f2)ft(f1,f2,f),-270.8e-3,270.8e-3,-270.8e-3,270.8e-3);
NLI = @(f)(16/27).*Ns.^1.03.*gamma.^2.*Le.^2.*pint(f); % NLI
NLI(0.165)
I tried to increase value as below, but didn't increase.
options = optimset('MaxFunEvals',20000);
pint =@(f)integral2(@(f1,f2)ft(f1,f2,f),-270.8e-3,270.8e-3,-270.8e-3,270.8e-3);
NLI = @(f)(16/27).*Ns.^1.03.*gamma.^2.*Le.^2.*pint(f); % NLI
fminsearch(NLI,0.165,options);
I suggest you plot NLI for reasonable values of f to see how the function behaves.

Sign in to comment.

 Accepted Answer

Matt J
Matt J on 19 Dec 2022
Edited: Matt J on 19 Dec 2022
The problem is that integral2 does not support an option called 'MaxFunEvals'. You imagined somehow that it does.

2 Comments

pint = @(f)integral2(@(f1,f2)ft(f1,f2,f),-270.8e-3,270.8e-3,-270.8e-3,270.8e-3,...
'AbsTol',1e-7);
NLI = @(f)(16/27).*Ns.^1.03.*gamma.^2.*Le.^2.*pint(f); % NLI
NLI(0.165)
ans = 0.0037
I am sorry for digging up a subject from 3 years ago, but when i opened integral2.m, in line 105 it is calling integral2Calc.m
Opening this program, I can see examples that can be run in order to reproduce the warnings. for example:
elseif maxNFEWarn
if ERRBND > max(ATOL,RTOL*abs(Q))
% Example:
% integral2(@(x,y)single(1./(x+y)),0,1,0,1,'Abstol',1e-4,'MaxFunEvals',3)
warning(message('MATLAB:integral2:maxFunEvalsFail',maxFunEvals));
if opstruct.ThrowOnFail
error(message('MATLAB:integral2:unsuccessful'));
end
else
% Example:
% integral2(@(x,y)single(1./(x+y)),0,1,0,1,'Abstol',1e-4,'MaxFunEvals',4)
warning(message('MATLAB:integral2:maxFunEvalsPass',maxFunEvals));
end
elseif minRectWarn
if ERRBND > max(ATOL,RTOL*abs(Q))
% Example:
% integral2(@(x,y)single(1./(x+y)),0,1,0,single(1),'Abstol',1e-5)
warning(message('MATLAB:integral2:minRectSizeFail'));
if opstruct.ThrowOnFail
error(message('MATLAB:integral2:unsuccessful'));
end
As you can see, the examples use 'MaxFunEvals',X as option of the function. However, as you mentioned and as I was able to confirm I am unable to run integral2 with it as an option, becouse it produces an error. Was it a plan to make it an option that was never realised, and someone just forgot to delete it from the code?
I am using matlab 2022b
thank you

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2021a

Asked:

on 19 Dec 2022

Commented:

on 16 Apr 2025

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!