|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)
$ p0 |3 ?6 C0 N* m7 Z. ffunction [r,n]=mulDFP(F,x0,B,eps)
9 |9 L1 U2 m' v) J+ @" Y( X: M%用拟牛顿法中的DFP法中求极小点和极小值。
& {) d& k% t6 X! q+ n%Designed by GAO,Mechanical Engineering College
j# L0 g- h: t$ y%Shenyang University of Technology
2 \$ ^! Z3 n1 S4 ~%November,20150 A9 _0 A _0 g; G$ L3 H
%调用格式:
- I. N7 c+ H, K) g+ v( y. {3 H%syms x1 x2;
& F: O0 w8 g9 ]/ k- w- l%z=表达式;
" Z! x1 T9 y3 ~9 N+ X%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
6 }/ n% q7 x, c4 t9 [8 f0 O }%X0=[给定初始值];. G r4 V2 ^" {' U* g
%f=[zx1;zx2];) ?2 ~& D9 s' v$ i5 v
%[n,r]=mulDFP(f,x0)# Y! R) p$ R$ ?; i, H Y" b
if nargin==2
8 q5 w6 _. n( ql = length(x0);. \9 H3 z) i. q$ z, o- \/ F
B=eye(l); %A取为单位阵' r. ?: ~# e1 q" i
eps=1.0e-4;1 a; [4 Q) N/ g: G, q
else! y1 X6 L3 P* [7 Q
if nargin==38 b/ |$ O- G. @- I1 J3 }
eps=1.0e-4;
" c+ D4 o$ S! ]' G+ kend
: @& w- n0 l; N% jend9 u- C' V1 L9 ~( }) x
fx = subs(F,findsym(F),x0);' F( }* e0 P+ H n( n
r=transpose(x0)-B*fx;. V( }: g( q8 |2 s: t' T! W
n=1;
0 D. N. I+ C& C1 H7 y: ~. }tol=1; s3 j8 N/ w/ R7 D! |9 s3 y
while tol>eps
& B9 ~4 i$ K4 Z' _% |. v& s) @x0=r;7 T0 H0 h. N, Y2 l- R
fx = subs(F,findsym(F),x0);" z6 a( u4 f2 g, B5 O2 d! r! d+ S
r=x0-B*fx;" t( D7 j6 _5 ~0 Z4 Z$ F
y=r-x0;
' s- l8 m7 n. _6 @fr = subs(F,findsym(F),r);2 ]+ `) x/ T3 o6 |2 \
z = fr-fx;! h/ U. ]6 b" G7 u5 w4 o9 ]* ?
B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A& Z% @) F- V0 V2 p9 E4 a
B=B1;
# p. C1 r$ U( b2 {: H1 n- bn=n+1;
" t: s) `; R- V2 Y& l4 ^if(n>100000) %迭代步数控制
) ^ b2 J G: K6 Y, `disp('迭代步数太多,可能不收敛!');2 X3 n% f! k, h* J! k3 I
return;
- u# H) `9 j \6 jend* \& y0 Q" d3 K D" f: n! s
tol=norm(r-x0);
$ C4 k; d7 U1 [0 |/ U6 B7 qend& o a; ~, x: A# B6 o$ M& l" X. C
问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|