|
優(yōu)化設(shè)計老師布置用MATLAB對變尺度法進行MATLAB編程(也叫擬牛頓法),我是用擬牛頓法中的BFD法進行編程,程序如下:(問題在程序后面)
: z% y" z5 x, j" M' E5 Y: l. n. _6 Jfunction [r,n]=mulDFP(F,x0,B,eps) \- {: u4 K9 {# @
%用擬牛頓法中的DFP法中求極小點和極小值。" ^5 n1 W: N* ^
%Designed by GAO,Mechanical Engineering College
$ i8 i& g7 z. N8 j7 k" B%Shenyang University of Technology
* g& H/ z' I, x! u4 [- c%November,20159 B- Y6 w& {2 l2 I, |* d$ v5 F
%調(diào)用格式: q9 B! L! m2 y
%syms x1 x2;
3 d! X) ^+ f' }1 Y%z=表達式;3 O; B: M- G+ q
%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
2 ]& V7 U) w. u# b# W. b%X0=[給定初始值];7 i( C! [" {3 ]7 O; ^8 }% i
%f=[zx1;zx2];
$ V, c) B4 V5 L4 ?. L%[n,r]=mulDFP(f,x0)
/ G. @3 a3 B9 i: [. a, `if nargin==2+ E! k9 `2 `# f8 ?
l = length(x0);
2 J' J% X% q7 L) }1 F$ aB=eye(l); %A取為單位陣& p: J3 T5 k# J2 d: O' b, l! r
eps=1.0e-4;2 v) l9 f8 |6 v8 I' f4 L2 l
else$ v' [. ]" W1 w
if nargin==3
3 l# p5 q% V' a. oeps=1.0e-4;
6 j( C1 i7 E3 f* Y5 d6 s' U0 Kend
r4 }1 c; N: n% S# f6 A( c0 ?( |end: A1 J' q7 K2 R R6 U# A
fx = subs(F,findsym(F),x0);
" a- S0 S. r% U9 v. A1 H, @r=transpose(x0)-B*fx;3 p9 I5 ]" ]: h. l1 L K
n=1;2 f- q5 y1 p7 h8 o
tol=1;7 r0 ^- a! M/ h% e2 i% g
while tol>eps6 c7 |8 N( A: r4 o* X5 ~
x0=r;! S7 t8 r, E1 L4 R, |
fx = subs(F,findsym(F),x0);
1 Y5 b# ~( X( o# ir=x0-B*fx;
3 T- n* h3 N* @; K4 v4 Fy=r-x0;' @2 Q5 T4 p1 g/ |5 E
fr = subs(F,findsym(F),r);
) d; J% ^' h3 W0 h" g# qz = fr-fx;
9 E" R: ?% Q! KB1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %調(diào)整A
( v) u' J& Z- l. YB=B1;' I0 _! @4 w: `/ t2 ^+ c+ M
n=n+1;
$ s8 Z+ x" K. qif(n>100000) %迭代步數(shù)控制: r/ M( _" E8 i: ~
disp('迭代步數(shù)太多,,可能不收斂,!');7 k0 k1 u1 R7 J \
return;8 a, s* w s8 B( n
end
& L+ H2 c: v; ptol=norm(r-x0);+ ^3 h5 Y i- Z8 t
end& g6 u1 c. a. R; m& R
問題:這個程序我是通過其他方法改變來的,現(xiàn)在想在這個基礎(chǔ)上增加一個求偏導(dǎo)的一個函數(shù)類似于“df=jacobian(f,[x1 x2]);%函數(shù)f的偏導(dǎo)”,,可是加進去以后就會出現(xiàn)錯誤,,改正好多次,都不行,,后來實在不行我就加在了調(diào)用函數(shù)中,,可是這么做,運行效率太低,,唯恐老師會減分,,所以希望各位前輩能給予實質(zhì)性的指點,謝謝,! |
|