|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)5 d6 W( A8 ]; \# {2 n function [r,n]=mulDFP(F,x0,B,eps)- Y" g9 t8 c9 z- R6 g2 X6 d- x %用拟牛顿法中的DFP法中求极小点和极小值。9 h$ p5 N- n7 u% _0 ^9 g6 a %Designed by GAO,Mechanical Engineering College 4 N/ x- e3 v2 w3 T9 e%Shenyang University of Technology* ]4 R7 z9 ~7 \5 O e. c K* v %November,2015 6 J) j4 q8 ]3 f. ~: Q%调用格式:' R5 T N" p: ^5 j5 s %syms x1 x2; + `& @8 F9 v& V' \! ?%z=表达式; ( i, h5 @! X1 N. t2 c7 B%zx1=simple(diff(z,x1)),zx2=diff(z,x2)3 l! }' @" l ?. V9 X; p3 b! E %X0=[给定初始值];% I5 U* i- ~- I, w/ t8 I %f=[zx1;zx2]; : D: {' H2 Q0 O+ V; g& a%[n,r]=mulDFP(f,x0) 4 j' W8 m/ L/ ~- O8 W- Eif nargin==2 6 g0 d5 [! d/ y3 Hl = length(x0); % R- m! p0 u1 k6 |; ?B=eye(l); %A取为单位阵 0 x; A/ ?1 g& t8 j# ceps=1.0e-4;6 c; d' L/ o' @: x9 c else& i5 c) O, g* Q* l' C* P if nargin==3 $ s/ Q8 `0 I& p. h$ T4 p4 Zeps=1.0e-4; ) @# w! Y/ \" {2 u6 Q6 O0 ]end * E/ l; C9 d/ d- @) j- Bend 7 I9 G; W G* ?0 {8 g" ~fx = subs(F,findsym(F),x0); - a: o. L/ i5 `6 |. h5 z5 fr=transpose(x0)-B*fx;% K) v1 K, [7 P- a: r/ i- J1 ? n=1;5 a6 {& R3 a# ` tol=1; ( { `3 j! c* [( j! Cwhile tol>eps3 q- }5 ^1 _' y/ Z+ ^ x0=r;7 `3 m$ I" o& b3 o fx = subs(F,findsym(F),x0);, B+ T' m& F4 U' z$ T6 j2 d6 V0 M- z' S r=x0-B*fx;+ m0 w6 S5 O x y=r-x0;% b" w5 K( c/ L fr = subs(F,findsym(F),r); 6 D1 E. y( H6 N, J, C$ t; tz = fr-fx; 9 i0 ^# o" q6 U$ J6 H# V6 l) gB1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A! E, e0 q. b# x [" x R* ^: b9 x& Z B=B1;* o- M+ @2 j" H! H3 z8 B n=n+1; 7 |" t/ }: J7 Q9 y, ?/ c6 m/ vif(n>100000) %迭代步数控制* q) e/ |- H0 U4 G' R% o disp('迭代步数太多,可能不收敛!'); $ D5 B1 C7 M6 @/ Z0 Qreturn; $ J# ~0 [; z* w! Wend A, e2 ]0 x/ x/ dtol=norm(r-x0);, \ [+ z# c2 Y/ H- q end . I) q( u" ~0 K5 n- _问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|