Using fminsearch with a function containing summation (via for loop)
1 次查看(过去 30 天)
显示 更早的评论
Dear MATLAB community,
I would like to obtain the values of , γ, δ, and L in the following equations:
To obtain these values, I am optimizing the error function :
where is the experimental result.
The strategy that I would like to implement is:
(1) Generate a function that calculates both the and
(2) Use that function to optimize the values of , γ, δ, and L using fminsearch (since I want to use Nelder-Mead optimization).
The script that I have written for the function is:
function [f] = ErrorFunction(x)
% n_ave = x(1)
% gamma = x(2)
% delta = x(3)
% length = x(4)
c = 299792458; % Speed of light in m/s
n_air = 1.000293; % Index of refraction of air
k = 1e-12; % ps to s coversion
cor_fac = 0.04;
M = 4;
fp_signal = 0.0; %fp_signal is E_FP(t)
for k=1:M
fp_signal = fp_signal +...
((x(1)-1)/(x(1)+1))^(2*k).*...
x(2)^(2*k).*...
raw_signal_ref.*k... % raw_signal_ref is E_reference(t)
(raw_time_ref.*(1e-12)-(x(1)*2*x(4)*M/c)-((x(1)-n_air)*x(4)/c))/...
x(3)^(2*M+1);
end
signal_simulated = cor_factor*(4*x(1))/(x(1)+1)^2*x(2)*...
((raw_signal_ref.*k.*((raw_time_ref*(1e-12)-(x(1)-1)*(x(4)*(1e-3)/c))/x(3))) + fp_signal); % raw_time_ref = t
f = sum(sim_signal_sam - raw_signal_sam); %raw_signal_sam is E_sample_(t)
To find , γ, δ, and L, I use fminsearch using the following separate script:
%% Optimization of paramters: n_ave , gamma, delta, length
x0 = [n_ave_in;gamma_in;delta_in;thickness_in];
x_optimized = fminsearch('ErrorFunction',x0);
The initial values for these parameters are , , , and .
When I run both scripts, however, I am getting this result:
Questions now are:
- Should I use a different approach on implementing the summation (via for loop) for the FP effect, i.e. using symsum?
- Can optimization using fminsearch be even done if a summation is inside the equation?
- What should be changed in the function script for fminsearch to work?
Thanks in advanced for your help.
0 个评论
采纳的回答
Alan Weiss
2021-4-21
Youu have several typos in the problem. I corrected them as best I could, but please make sure that I didn't change anything that you meant to write.
Your main problem is not passing the extra data for the problem. Here is my version, with typos corrected as best I could and with data passed correctly:
function [f] = ErrorFunction(x,raw_signal_ref,raw_signal_sam,raw_time_ref)
% n_ave = x(1)
% gamma = x(2)
% delta = x(3)
% length = x(4)
c = 299792458; % Speed of light in m/s
n_air = 1.000293; % Index of refraction of air
k = 1e-12; % ps to s coversion
cor_fac = 0.04;
M = 4;
fp_signal = 0.0; %fp_signal is E_FP(t)
for k=1:M
fp_signal = fp_signal +...
((x(1)-1)/(x(1)+1))^(2*k)*...
x(2)^(2*k)*...
raw_signal_ref*k.*... % raw_signal_ref is E_reference(t)
(raw_time_ref*(1e-12)-(x(1)*2*x(4)*M/c)-((x(1)-n_air)*x(4)/c))/...
x(3)^(2*M+1);
end
sim_signal_sam = cor_fac*(4*x(1))/(x(1)+1)^2*x(2)*...
((raw_signal_ref*k.*((raw_time_ref*(1e-12)-(x(1)-1)*(x(4)*(1e-3)/c))/x(3))) + fp_signal); % raw_time_ref = t
f = sum(sim_signal_sam - raw_signal_sam); %raw_signal_sam is E_sample_(t)
Here is how I called that function after placing x0 in the workspace:
fun = @(x)ErrorFunction(x,raw_signal_ref,raw_signal_sam,raw_time_ref);
x_optimized = fminsearch(fun,x0);
When I run the problem fminsearch exits with this message:
Exiting: Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option.
Current function value: -907777101105805751482258996129483335894703616332083863052416498711493108878399830640514887677380554503199361365622832602682026028412939674686787717791027291595548412048643393197842340492625295522296145364560679359874843053719749781643093886750418805308954509312.000000
So I am not sure that my corrections were complete or correct, but at least it now runs.
Alan Weiss
MATLAB mathematical toolbox documentation
2 个评论
Alan Weiss
2021-4-21
Come to think of it, perhaps the last line should be
f = sum((sim_signal_sam - raw_signal_sam).^2); %raw_signal_sam is E_sample_(t)
Alan Weiss
MATLAB mathematical toolbox documentation
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!