|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)
1 C5 \' t8 O5 z8 x+ d, sfunction [r,n]=mulDFP(F,x0,B,eps)
' x. `5 x$ |7 L7 ]! J$ M%用拟牛顿法中的DFP法中求极小点和极小值。
. |% Q% w! D6 R) m%Designed by GAO,Mechanical Engineering College
) I3 b( K; O6 Q* [* `%Shenyang University of Technology
) A9 A9 O8 N3 W4 b3 w7 w& C%November,2015
8 Z7 M3 ]/ F, C" h4 f$ ^0 A" ~%调用格式:2 Q' `. b8 Z3 x' S6 X! W" q" ]
%syms x1 x2;
% I3 m5 v, d1 Y# K3 W%z=表达式;
8 {( F5 c, z5 L%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
; T( \4 [1 S4 P9 Z6 I9 y6 S%X0=[给定初始值];
2 @" V! r: c9 i( C; _( R& L* y: \; d m%f=[zx1;zx2];
- x" K( U4 T) D4 T6 a/ X%[n,r]=mulDFP(f,x0), N5 B# d: |* n6 s% {' {! h
if nargin==2$ A# k2 m/ G! u2 G/ Q
l = length(x0);; G4 A" {* F' z4 L
B=eye(l); %A取为单位阵; S) q. e9 Q" H/ I& x
eps=1.0e-4;
4 c4 i( U2 J7 X. s. V$ X* ielse, D1 H( d( t4 U' f. y3 R
if nargin==3( b) q, L3 \; @+ p
eps=1.0e-4;
. \: h/ m' n0 {+ k& b: eend; [; j9 n) ~, b2 Z0 j6 H
end0 D, |+ s! F$ ~& _, E
fx = subs(F,findsym(F),x0);
# @4 I2 c/ R) l" \+ j/ m& {! o- l# ]r=transpose(x0)-B*fx;8 Y; l% `9 z. W/ ~6 w; x6 N2 `
n=1;8 w0 L7 A" S& G K( r5 U+ Y9 y
tol=1;9 C9 Y, g! I: r+ E; D7 r. c
while tol>eps3 v, p! b8 C& [# n1 k' r/ R7 Y6 {
x0=r;) r1 F; z+ ~) ^; M* m
fx = subs(F,findsym(F),x0);; u% R4 [/ J, U9 r- m4 L
r=x0-B*fx;* b" E9 M r$ g# l# t4 e
y=r-x0;. ^3 |8 @& u! Q) q
fr = subs(F,findsym(F),r);
3 C x' _" Q! Q4 Z# ez = fr-fx;8 u3 Z5 ?( F2 W. s
B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A
8 ]; O$ @9 Q7 ]$ y( XB=B1;4 } H6 x; h5 ]) ]7 H
n=n+1;
" o% x5 y) D# |( X" l- yif(n>100000) %迭代步数控制# h ^ h) ~: q) D& }, J7 ]
disp('迭代步数太多,可能不收敛!');3 ` v6 e6 o9 w. I+ [+ \2 s: r
return;
$ w& I- v! l' Fend
z. J! |& T. U7 E& t+ |+ Stol=norm(r-x0);- D' p2 [& c+ \6 x: m
end9 j, `4 ], c% j) Y: _
问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|