how to increase 'MaxFunEvals'
30 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Torsten
2022 年 12 月 19 日
I suggest you plot NLI for reasonable values of f to see how the function behaves.
採用された回答
Matt J
2022 年 12 月 19 日
編集済み: Matt J
2022 年 12 月 19 日
The problem is that integral2 does not support an option called 'MaxFunEvals'. You imagined somehow that it does.
2 件のコメント
Szymon
2025 年 4 月 16 日
Hi @Matt J
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
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Symbolic Math Toolbox についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!