作者foreverlong (foreverlong)
看板MATLAB
標題[問題]for迴圈,如何忽略某case內部副程式中的錯
時間Fri Jan 6 15:00:22 2012
問題:如何忽略某case內部副程中的錯誤,讓程式回到主程式中繼續執行下一個計算。
以for指令給予不同起始猜值F0進行最佳化函數fmincon的計算,fmincon呼叫objfun,
objfun呼叫fundae並以ode15s solver求解微分代數分程式,ode15s求得的計算值與實
驗值進行比較(obj=…),期望得到一組最佳的[Vair A B C]。問題出在某些情況下,
ode15s solver 無法求解至積分的端點,顯示error,所以錯誤出現在for 迴圈內呼叫的
副程式。
請教高手們,如何才能忽略某次(i迴圈)內部副程式錯誤的,繼續執行下一個(i+1迴圈)的
計算。
錯誤部分說明
積分上下界:tspan=[1 15] 積分結果z<15 出現error
迴圈:i= 1 2 3 其中在i=2的case中會有錯,程式自動停止。如何忽略2的錯誤繼續執行
i=3的case。
謝謝大家~
主程式
f=[1 0.75 0.5 0.25 0.01];
for i=1:5
Vair0=4.21107*10.^-5;
A0=f(i).*0.65;
B0=f(i).*1.0099*0.01;
C0=f(i).*0.023;
F0=[Vair0 A0 B0 C0]'
options=optimset('Display','iter','TolFun',1e-6,'Tolx',1e-6,'Algorithm','sqp');
yL=[0.0000002187 0.0065 1.099*0.000001 0.00023]';
yU=[0.0001948 0.65 1.0099*0.01 0.023]';
[z,favl,exitflag,output]=fmincon(@objfun,F0,[],[],[],[],yL,yU,[],options)
pause
end
obj副程式
function obj=objfun(F)
.
.
.
.
[z,y]=ode15s(@fundae,tspan,y0,option);
.
.
.
obj=((y1cal_end-y1exp_end)./y1exp_end).^2+((y2cal_end-y2exp_end)./y2exp_end).^2;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.128.119.31
1F:→ kdjf:try.... cache.... 01/06 22:15
2F:→ foreverlong:謝謝!但不明白cache的意思... 01/09 20:22
3F:→ foreverlong:help or doc cache沒有說明的敘述 01/09 20:22
4F:→ laechan:catch? or cache, 意思是原本遭遇錯誤時會中止, 使用這個 01/10 08:09
5F:→ laechan:語法去包在你認為可能出錯的程式段上,它遇到錯誤就會繼續 01/10 08:09
6F:→ laechan:在某一個程式語言就如下if(catch(ob=find_object(FILES))) 01/10 08:10
7F:→ foreverlong:太感謝了! 使用if... try...catch...continue..end 01/10 16:25
8F:→ foreverlong:就可以了...謝謝你們提供的意見!!! 01/10 16:27