Matlab程序——修正鲍威尔Powell法
生活随笔
收集整理的這篇文章主要介紹了
Matlab程序——修正鲍威尔Powell法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
%函數文件
function y=fun(x1,x2)
y=2*x1^2+x2^2-x1*x2;
%Powell主程序
clear;clc;
x0=[2 2];
xk=x0;
ideal_error=10^(-4);
actural_error=1;
d1=[1 0];
d2=[0 1];
k=1;
MaxLoopNum=20;
while(actural_error>ideal_error&&MaxLoopNum>k)%沿d1方向進行一維搜索syms a1 x1 x2;xk1=xk+a1*d1;x1=xk1(1);x2=xk1(2);fun1=fun(x1,x2);fxa=diff(fun1,'a1')==0;a1=solve(fxa,'a1');%計算中間點xk1=xk+a1*d1;%沿d2方向進行一維搜索syms a2 x1 x2;xk2=xk1+a2*d2;x1=xk2(1);x2=xk2(2);fun1=fun(x1,x2);fxa=diff(fun1,'a2')==0;a2=solve(fxa,'a2');%計算終點xk2=xk1+a2*d2;%計算映射點x3=2*xk2-xk;%計算實際收斂精度xkerror=eval(x3-xk);actural_error=norm(xkerror);%輸出迭代數據fprintf('第%d次迭代結果如下:\n',k)fprintf('起始點:x%d0=[%f %f]\n',k,xk(1),xk(2))fprintf('中間點:x%d1=[%f %f]\n',k,xk1(1),xk1(2))fprintf('終點:x%d2=[%f %f]\n',k,xk2(1),xk2(2))fprintf('映射點:x%d3=[%f %f]\n',k,x3(1),x3(2))fprintf('第一個步長:a%d1=%f\n',k,a1)fprintf('第二個步長:a%d2=%f\n',k,a2)fprintf('第一個方向:d%d1=[%f %f]\n',k,d1(1),d1(2))fprintf('第二個方向:d%d2=[%f %f]\n',k,d2(1),d2(2))fprintf('實際收斂精度:%f\n',actural_error)%求出起始點,中間點,終點,映射點處的函數值syms x1 x2;fun1=fun(x1,x2);fun1=inline(fun1);f0=feval(fun1,xk(1),xk(2));f1=feval(fun1,xk1(1),xk1(2));f2=feval(fun1,xk2(1),xk2(2));f3=feval(fun1,x3(1),x3(2));%確定函數值下降最多的方向Inc(1)=f0-f1;Inc(2)=f1-f2;[Incm,column]=max(Inc);%判斷是否更換搜索方向F1=f0;F2=f2;F3=f3;temp1=(F1-2*F2+F3)*(F1-F2-Incm)^2;temp2=0.5*Incm*(F1-F3)^2;if(Inc(1)>Inc(2)&&F3<F1&&temp1<temp2) d1=d2;d2=xk2-xk;xk=x3;elseif(Inc(1)<Inc(2)&&F3<F1&&temp1<temp2)d2=xk2-xk;xk=x3;elsexk=xk2;endk=k+1;
end
總結
以上是生活随笔為你收集整理的Matlab程序——修正鲍威尔Powell法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeCanyon上的12种最佳CSS
- 下一篇: gaster字体转换器_gaster语言