|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)
8 Y, a0 f8 x1 h3 G) y+ ofunction [r,n]=mulDFP(F,x0,B,eps)
- Z3 J8 z$ u/ }. _%用拟牛顿法中的DFP法中求极小点和极小值。
2 B: L/ h! G& {# a: \% A%Designed by GAO,Mechanical Engineering College( E0 t. E8 J( ?* S. g
%Shenyang University of Technology: X+ M6 p3 @0 y# t* c+ M/ v
%November,2015
* Q; Q/ y) |: P0 f# l j! ?7 _%调用格式:, l8 m5 m. Q% `/ a1 E: x
%syms x1 x2;4 n( M2 j' ~: d- q' D
%z=表达式;
8 w( G% N4 z0 W) j, v- f' @%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
& b, R* v, j" m* R% @! g%X0=[给定初始值];7 `2 Z, ~" \ U! K7 S: F- U
%f=[zx1;zx2];1 }: P& h, l& t9 i* h- H
%[n,r]=mulDFP(f,x0)
7 G( G! X% q& Jif nargin==2+ _5 [% O! o2 K/ t
l = length(x0);
. v9 g& ^ u/ V( aB=eye(l); %A取为单位阵
/ C2 K/ m# G" a- Seps=1.0e-4;. C. S6 K, q9 a& o: B
else& T! g7 p: ~0 H) g6 s$ W" Y1 q' K
if nargin==3
' i; n5 c _1 E, O! r8 leps=1.0e-4;' G# \$ O3 s: ~$ `
end
9 h2 l0 I9 \5 a6 Fend
7 |3 U2 Q$ G% x# h' [6 \fx = subs(F,findsym(F),x0);
& w; M8 l l) G* Y* kr=transpose(x0)-B*fx;6 r& W! j0 Z g# }) ]( N. O; b6 J
n=1;
3 \$ E. I& r8 i" Ptol=1;, y' g5 j0 c. |$ S* Q1 R+ `' K
while tol>eps3 V( ^! |6 R) k0 y4 g
x0=r;
6 o" ~1 `, ^5 u3 I: nfx = subs(F,findsym(F),x0);
& ?" F s; {4 W5 U7 zr=x0-B*fx;
4 t1 {0 t4 t2 ?! |y=r-x0;
$ H$ `0 K3 j0 D0 P; Vfr = subs(F,findsym(F),r);" n3 b2 p1 i. P! ?; |
z = fr-fx;
( s1 {, x. K t0 c, gB1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A* [' a4 a5 M& e
B=B1;% P4 b6 ~& `1 ?1 A* o0 s8 q
n=n+1;# [3 L( A+ E5 i
if(n>100000) %迭代步数控制
9 C" c m5 t" e( ]/ w* |; bdisp('迭代步数太多,可能不收敛!');; e' B g" a( H U" k
return;2 Z% E$ b5 y: v5 Q. [( O) \ y
end4 `. T( u. ?" d3 m
tol=norm(r-x0); R) Q7 y P, _4 _1 ]5 `1 f; ?
end
8 F( v( z M; S. c. y& ?" Z9 _问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|