|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)( {! R: Y* k/ J
function [r,n]=mulDFP(F,x0,B,eps)
9 z3 |' ], u8 C b$ s%用拟牛顿法中的DFP法中求极小点和极小值。
! ?2 q) p0 _. \0 c& S+ e%Designed by GAO,Mechanical Engineering College
% }1 k+ W$ H# k; a%Shenyang University of Technology! |0 G7 F2 o" F# ]1 z
%November,2015* J8 M* r/ o+ X9 g* e6 d/ S, Y
%调用格式:
- L/ s A5 U, b. r& L. c%syms x1 x2;6 T& V; l ?" F: T8 h+ `
%z=表达式;- M! h- S1 n9 X' H3 H- s
%zx1=simple(diff(z,x1)),zx2=diff(z,x2)& b l M, ^! L9 F0 b; e
%X0=[给定初始值];* v& R9 A' N, m) V( R% ?; u5 a% U2 n
%f=[zx1;zx2];( a! I$ E# o- O
%[n,r]=mulDFP(f,x0) B3 E+ ]1 x; L+ s
if nargin==2. q" a+ R2 ~( ], q; Z, _: ]
l = length(x0);
# W4 `6 I2 V* O/ E9 c8 M' tB=eye(l); %A取为单位阵
- g* H& Y7 y. A- z5 u% A: g$ C- neps=1.0e-4;, J! X4 S6 W9 e
else/ \9 d: g- `, x7 S6 \4 e; H3 P
if nargin==3' q( G" d" p! x# D6 Z' @
eps=1.0e-4;
$ x) ^+ e8 E/ Y; `end
& ?6 A+ E' _+ i, Y4 {1 o" q; mend: C: ^8 u/ H b+ c% X
fx = subs(F,findsym(F),x0);, I1 u9 h' J8 D/ k4 H
r=transpose(x0)-B*fx;0 q0 ?( h4 A# W. ]. V% K
n=1;
1 w1 C. L7 }# o6 M0 N! ?# btol=1;6 R* V1 Q0 |5 G$ h" a: n
while tol>eps
+ } o( t! t5 B8 B/ o% wx0=r;$ b6 t# t7 {1 h4 f; l
fx = subs(F,findsym(F),x0);
( G* i, u: _) T" dr=x0-B*fx;8 N a: {4 K1 G9 L' Z5 ^' `+ ^
y=r-x0;: k; i0 u- M1 e3 V/ X
fr = subs(F,findsym(F),r);
/ O# d9 v% x7 w' h& d8 L, vz = fr-fx;. E0 c7 M3 F/ D% \9 m
B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A, B0 D n1 f5 g$ M6 R
B=B1;
0 y4 W" a/ O. W$ s- C% T: Bn=n+1;
( A. }* [0 i! f9 i) T8 s9 Lif(n>100000) %迭代步数控制$ X" D4 p- J/ d% ~1 y. y' x( Z
disp('迭代步数太多,可能不收敛!');
# t3 @9 p9 N Z' Kreturn;
( S3 v* u9 X6 w9 Wend0 G7 I) q2 e1 K6 \. L
tol=norm(r-x0);5 Q4 \( C, `8 E! Y# z
end' p3 ?2 ~: G! c" G; F3 _9 o$ Y
问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|