Use of optimset to change maxfun evals

조회 수: 1 (최근 30일)
Gisela
Gisela 2016년 3월 29일
댓글: Steven Lord 2016년 3월 29일
Hi! I have a running code to which I'd like to change the default number of iterations. Without setting options=... the script runs just fine as it is supposed to do. But the moment I add options it says that I gave too many input arguments.
function FIT1
format long
clc
close all
clear all
V=0.5; % volume del reattore [L]
k0=[616350 0.86 1.3 2]; %stima parametri iniziali, il primo è k1, secondo terzo e quarto sono gli esponenti di A B C
%carica i dati UNO= =================================================================
load ('prova1.mat','seconds','absorbance')
csi1_1=0.2276*absorbance/1000; %in mol/L (M)
sec_1=seconds;
C0_1=[0.00005 0.001 0.05]; %species A,B and C
C0_A_1=C0_1(1); %conc OF IO3- in mol/L
C0_B_1=C0_1(2); %conc OF I- in mol/L
C0_C_1=C0_1(3); %conc OF H+ in mol/L
C_A_1=C0_A_1-csi1_1;
C_B_1=C0_B_1-5*csi1_1;
C_C_1=C0_C_1-6*csi1_1;
Cexp1=[C_A_1 C_B_1 C_C_1];
%carica i dati DUE ==================================================================
load ('prova2.mat','seconds','absorbance')
csi1_2=0.2276*absorbance/1000; %in mol/L (M)
sec_2=seconds;
C0_2=[0.00003 0.001 0.025]; %species A,B and C
C0_A_2=C0_2(1); %conc OF IO3- in mol/L
C0_B_2=C0_2(2); %conc OF I- in mol/L
C0_C_2=C0_2(3); %conc OF H+ in mol/L
C_A_2=C0_A_2-csi1_2;
C_B_2=C0_B_2-5*csi1_2;
C_C_2=C0_C_2-6*csi1_2;
Cexp2=[C_A_2 C_B_2 C_C_2];
%carica i dati TRE ==================================================================
load ('prova3.mat','seconds','absorbance')
csi1_3=0.2276*absorbance/1000; %in mol/L (M)
sec_3=seconds;
C0_3=[0.00005 0.001 0.01]; %species A,B and C
C0_A_3=C0_3(1); %conc OF IO3- in mol/L
C0_B_3=C0_3(2); %conc OF I- in mol/L
C0_C_3=C0_3(3); %conc OF H+ in mol/L
C_A_3=C0_A_3-csi1_3;
C_B_3=C0_B_3-5*csi1_3;
C_C_3=C0_C_3-6*csi1_3;
Cexp3=[C_A_3 C_B_3 C_C_3];
%carica i dati QUATTRO ==================================================================
load ('prova4.mat','seconds','absorbance')
csi1_4=0.2276*absorbance/1000; %in mol/L (M)
sec_4=seconds;
C0_4=[0.00005 0.0015 0.025]; %species A,B and C
C0_A_4=C0_4(1); %conc OF IO3- in mol/L
C0_B_4=C0_4(2); %conc OF I- in mol/L
C0_C_4=C0_4(3); %conc OF H+ in mol/L
C_A_4=C0_A_4-csi1_4;
C_B_4=C0_B_4-5*csi1_4;
C_C_4=C0_C_4-6*csi1_4;
Cexp4=[C_A_4 C_B_4 C_C_4];
%carica i dati CINQUE ==================================================================
load ('prova5.mat','seconds','absorbance')
csi1_5=0.2276*absorbance/1000; %in mol/L (M)
sec_5=seconds;
C0_5=[0.00005 0.00075 0.025]; %species A,B and C
C0_A_5=C0_5(1); %conc OF IO3- in mol/L
C0_B_5=C0_5(2); %conc OF I- in mol/L
C0_C_5=C0_5(3); %conc OF H+ in mol/L
C_A_5=C0_A_5-csi1_5;
C_B_5=C0_B_5-5*csi1_5;
C_C_5=C0_C_5-6*csi1_5;
Cexp5=[C_A_5 C_B_5 C_C_5];
%carica i dati NOVE ==================================================================
load ('prova9.mat','seconds','absorbance')
csi1_9=0.2276*absorbance/1000; %in mol/L (M)
sec_9=seconds;
C0_9=[0.00005 0.001 0.01]; %species A,B and C
C0_A_9=C0_9(1); %conc OF IO3- in mol/L
C0_B_9=C0_9(2); %conc OF I- in mol/L
C0_C_9=C0_9(3); %conc OF H+ in mol/L
C_A_9=C0_A_9-csi1_9;
C_B_9=C0_B_9-5*csi1_9;
C_C_9=C0_C_9-6*csi1_9;
Cexp9=[C_A_9 C_B_9 C_C_9];
%minimizzo funzione errore ==========================================================
% Metodo fminsearch: simplesso(lento ma spesso convergente)
options=optimset('MaxFunEvals',10^12)
[k,fval] = fminsearch(@err,k0,[], sec_1,sec_2,sec_3,sec_4,sec_5,sec_9,Cexp1,Cexp2,Cexp3,Cexp4,Cexp5,Cexp9,options);
k %mostra valore parametri alla fine
%funzione errore come somma di errori
function S = err(k,sec_1,sec_2,sec_3,sec_4,sec_5,sec_9,Cexp1,Cexp2,Cexp3,Cexp4,Cexp5,Cexp9)
S = err1(k,sec_1,Cexp1) + err2(k,sec_2,Cexp2) + err3(k,sec_3,Cexp3)+ err4(k,sec_4,Cexp4) + err5(k,sec_5,Cexp5)+ err9(k,sec_9,Cexp9);
S %mostra errore ad ogni passo
%UNO==================================================================
function S1 = err1(k,sec_1,Cexp1)
% predizione del modello con i parametri k attuali
sol1 = diff1(k,sec_1);
Ccalc1 = deval(sol1,sec_1)'; % ricalcolo della soluzione sui soli tempi sperimentali
S1 = norm(Ccalc1 - Cexp1);
function theoretical1=diff1(k,sec_1)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C01 = [0.00005 0.001 0.05]; % concentrazione iniziale
theoretical1= ode45(@myode1,sec_1,C01,[],k,nu);
function dCdt1 = myode1(t,C,k,nu)
R1 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r1 = nu*R1; % velocita' di produzione delle singole specie
dCdt1 = r1; % BMi = derivate nel tempo delle concentrazioni
%DUE========================================================================
function S2 = err2(k,sec_2,Cexp2)
% predizione del modello con i parametri k attuali
sol2 = diff2(k,sec_2);
Ccalc2 = deval(sol2,sec_2)'; % ricalcolo della soluzione sui soli tempi sperimentali
S2 = norm(Ccalc2 - Cexp2);
function theoretical2=diff2(k,sec_2)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C02 = [0.00003 0.001 0.025]; % concentrazione iniziale
theoretical2= ode45(@myode2,sec_2,C02,[],k,nu);
function dCdt2 = myode2(t,C,k,nu)
R2 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r2 = nu*R2; % velocita' di produzione delle singole specie
dCdt2 = r2; % BMi = derivate nel tempo delle concentrazioni
%TRE========================================================================
function S3 = err3(k,sec_3,Cexp3)
% predizione del modello con i parametri k attuali
sol3 = diff3(k,sec_3);
Ccalc3 = deval(sol3,sec_3)'; % ricalcolo della soluzione sui soli tempi sperimentali
S3 = norm(Ccalc3 - Cexp3);
function theoretical3=diff3(k,sec_3)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C03 = [0.00005 0.001 0.01]; % concentrazione iniziale
theoretical3= ode45(@myode3,sec_3,C03,[],k,nu);
function dCdt3 = myode3(t,C,k,nu)
R3 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r3 = nu*R3; % velocita' di produzione delle singole specie
dCdt3 = r3; % BMi = derivate nel tempo delle concentrazioni
%QUATTRO========================================================================
function S4 = err4(k,sec_4,Cexp4)
% predizione del modello con i parametri k attuali
sol4 = diff4(k,sec_4);
Ccalc4 = deval(sol4,sec_4)'; % ricalcolo della soluzione sui soli tempi sperimentali
S4 = norm(Ccalc4 - Cexp4);
function theoretical4=diff4(k,sec_4)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C04 = [0.00005 0.0015 0.025]; % concentrazione iniziale
theoretical4= ode45(@myode4,sec_4,C04,[],k,nu);
function dCdt4 = myode4(t,C,k,nu)
R4 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r4 = nu*R4; % velocita' di produzione delle singole specie
dCdt4= r4; % BMi = derivate nel tempo delle concentrazioni
%CINQUE==================================================================
function S5 = err5(k,sec_5,Cexp5)
% predizione del modello con i parametri k attuali
sol5 = diff5(k,sec_5);
Ccalc5 = deval(sol5,sec_5)'; % ricalcolo della soluzione sui soli tempi sperimentali
S5 = norm(Ccalc5 - Cexp5);
function theoretical5=diff5(k,sec_5)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C05 = [0.00005 0.00075 0.025]; % concentrazione iniziale
theoretical5= ode45(@myode5,sec_5,C05,[],k,nu);
function dCdt5 = myode5(t,C,k,nu)
R5 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r5 = nu*R5; % velocita' di produzione delle singole specie
dCdt5 = r5; % BMi = derivate nel tempo delle concentrazioni
%NOVE==================================================================
function S9 = err9(k,sec_9,Cexp9)
% predizione del modello con i parametri k attuali
sol9 = diff9(k,sec_9);
Ccalc9 = deval(sol9,sec_9)'; % ricalcolo della soluzione sui soli tempi sperimentali
S9 = norm(Ccalc9 - Cexp9);
function theoretical9=diff9(k,sec_9)
nu=[-1; -5; -6]; % matrice stechiometrica; ordine specie: (A B C)
C09 = [0.00005 0.00102 0.025]; % concentrazione iniziale
theoretical9= ode45(@myode9,sec_9,C09,[],k,nu);;
function dCdt9 = myode9(t,C,k,nu)
R9 = k(1)*C(1)^k(2)*C(2)^k(3)*C(3)^k(4); % velocita' delle 2 reazioni
r9 = nu*R9; % velocita' di produzione delle singole specie
dCdt9 = r9; % BMi = derivate nel tempo delle concentrazioni
I'm not sure whether I get this error because I have to add options in some other place I don't know or if it is because I'm asking the system to do too many iterations.

채택된 답변

Torsten
Torsten 2016년 3월 29일
Use
[k,fval] = fminsearch(@(k)err(k,sec_1,sec_2,sec_3,sec_4,sec_5,sec_9,Cexp1,Cexp2,Cexp3,Cexp4,Cexp5,Cexp9),k0,options);
instead of
[k,fval] = fminsearch(@err,k0,[],sec_1,sec_2,sec_3,sec_4,sec_5,sec_9,Cexp1,Cexp2,Cexp3,Cexp4,Cexp5,Cexp9,options);
Best wishes
Torsten.
  댓글 수: 2
Gisela
Gisela 2016년 3월 29일
thank you very much!!! it works perfectly now :)
Steven Lord
Steven Lord 2016년 3월 29일
I would recommend a slight modification to Torsten's suggestion. Rather than passing twelve additional parameters into your objective function (which increases the odds of you omitting one or adding them out of order) I would pack them in a struct array and pass the struct array as the one additional parameter. You can then refer to the fields in the struct inside the objective function, or unpack it into the individual variables.
S = struct('x', 1, 'y', 2, 'z', 3);
Now pass S instead of passing x, y, and z.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Data Type Conversion에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by