|
優(yōu)化設(shè)計老師布置用MATLAB對變尺度法進行MATLAB編程(也叫擬牛頓法),我是用擬牛頓法中的BFD法進行編程,程序如下:(問題在程序后面)! I% R! S: H2 V0 h& O: a3 T
function [r,n]=mulDFP(F,x0,B,eps)9 z% O& Z# t# S6 m3 S" j
%用擬牛頓法中的DFP法中求極小點和極小值。
! j7 E9 `) G* t& Q1 X( M3 ], Q%Designed by GAO,Mechanical Engineering College
5 E* R5 P/ f5 H" T X" d%Shenyang University of Technology1 N0 @$ m k/ l0 y9 ]
%November,2015- X# S2 w: L/ |
%調(diào)用格式:* k# M2 U3 P* W
%syms x1 x2;* c% k2 s9 B. z9 L+ R: ? o
%z=表達式;
/ }+ ^, \ i1 L7 M5 n' Q%zx1=simple(diff(z,x1)),zx2=diff(z,x2)+ N' X* a+ R5 { X
%X0=[給定初始值];3 }$ N) @, q7 w9 J( y! r
%f=[zx1;zx2];
5 n9 J; A, k% A%[n,r]=mulDFP(f,x0)
: E" R0 O1 G/ N6 s1 o( Nif nargin==2
; X1 }4 g- z- Q; M& I' i# q4 I# y8 pl = length(x0);! a- l4 w, e1 d
B=eye(l); %A取為單位陣
8 Y8 n$ `6 Y/ O" F9 seps=1.0e-4;# i4 X" G* @# e
else
$ k- C6 n2 o0 i6 o% {( ^if nargin==3
% }) q" U: R) K; @- A4 Neps=1.0e-4;( h" R0 P8 J. h3 e9 E/ S
end! r/ j/ d; d! p L; w- b; X
end" m! p4 S1 s0 z- @/ e. N
fx = subs(F,findsym(F),x0);; z4 O* Z" ]+ Z1 @
r=transpose(x0)-B*fx;
: D5 Y' Z4 M4 E; {7 J Q3 [# J8 Pn=1; o* {3 c. Z" M% l
tol=1;% D: k6 ^, Q( Y& D: N: u( j- o
while tol>eps4 E( r8 ~1 J* f; _# I5 M: }! e
x0=r;( T2 P; z ~! q+ [( g& B
fx = subs(F,findsym(F),x0);& ^: b, S& v1 s. v% r3 M# J
r=x0-B*fx;6 n5 ?- C) O% [- c( G+ P
y=r-x0;
& _; u5 O0 O& ~ c5 `! Rfr = subs(F,findsym(F),r);
/ B: _% O( j" \$ y V8 ez = fr-fx;
% R/ W+ H( r# x9 fB1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %調(diào)整A' ^9 F% z4 u( O! t4 F; k, d5 k% X
B=B1;
: n3 x3 U% l2 p" a$ `n=n+1;
% q/ N8 H( q# y6 l& jif(n>100000) %迭代步數(shù)控制+ M) p. K! g- H% w4 h" R( u! }
disp('迭代步數(shù)太多,可能不收斂!');
, J. H8 n. J" ~" p+ @. ]return;
' i4 [2 J- Q; E& lend
+ H5 a+ b( \9 M# @tol=norm(r-x0);
7 j, Z3 d! D' I- o9 u& Pend
, @, T# ]8 N; P. Y% x. _* c% h問題:這個程序我是通過其他方法改變來的,現(xiàn)在想在這個基礎(chǔ)上增加一個求偏導的一個函數(shù)類似于“df=jacobian(f,[x1 x2]);%函數(shù)f的偏導”,可是加進去以后就會出現(xiàn)錯誤,改正好多次,都不行,后來實在不行我就加在了調(diào)用函數(shù)中,可是這么做,運行效率太低,唯恐老師會減分,所以希望各位前輩能給予實質(zhì)性的指點,謝謝! |
|