|
優(yōu)化設(shè)計老師布置用MATLAB對變尺度法進行MATLAB編程(也叫擬牛頓法),我是用擬牛頓法中的BFD法進行編程,程序如下:(問題在程序后面)% f* U |4 G" U, j2 S% ~, ^. a
function [r,n]=mulDFP(F,x0,B,eps)
3 V! x. w8 i) l2 q3 N%用擬牛頓法中的DFP法中求極小點和極小值。: j. P# c, D6 m( v- E
%Designed by GAO,Mechanical Engineering College5 ~! F# T; f; V( a ~7 @
%Shenyang University of Technology6 l$ o0 P3 i3 f& @9 s
%November,2015' s& Z! c. q& w! n6 k1 k1 o
%調(diào)用格式:
' M% o1 \ ~4 Y& a) |; N%syms x1 x2;
& E1 z* G+ K0 S: f* ?" p%z=表達式;+ F% T) n" s# k2 V* E
%zx1=simple(diff(z,x1)),zx2=diff(z,x2)6 N. U O5 i A1 c, I$ M; N I
%X0=[給定初始值];
' g& |8 e% H3 I: i5 G/ P%f=[zx1;zx2];% |# b" f: h. w3 h7 Y& a* X
%[n,r]=mulDFP(f,x0)
2 G# u. t* a# Pif nargin==2& c L! x' u5 s6 z' N# R* }8 x- q
l = length(x0);
. K7 r& O2 k2 ?. JB=eye(l); %A取為單位陣/ I4 }- p/ |9 H+ i. ]9 s% L
eps=1.0e-4;
8 [/ j4 ], i" n% L% Kelse f; F3 N( D- I$ J! X3 u3 v4 }
if nargin==33 Y" A: D9 D0 v T" S
eps=1.0e-4;
2 j1 e- j k1 S$ c4 gend
: K9 i3 T) V; m, @) ~end
0 h- m8 h1 f/ {1 mfx = subs(F,findsym(F),x0);. j. M$ J7 [3 n( T/ W- m
r=transpose(x0)-B*fx;
5 \ b0 O3 J# }# O9 Q) [n=1;$ a* i' \7 T$ M4 P0 i7 q
tol=1;
$ Q& J6 `; Y7 [0 s6 zwhile tol>eps
/ T" T; I2 m- \" N1 Y( Px0=r;
9 b. ]8 x8 m7 [% R. R3 nfx = subs(F,findsym(F),x0);) y2 r+ ^8 @) X# K; l8 C8 e" J
r=x0-B*fx;" |; f. Q/ N( ?, L9 k) g; q
y=r-x0;) R* N8 ?+ i6 p- z$ L1 L
fr = subs(F,findsym(F),r);- F. r( h8 ]2 X9 C& x* D. d* ~
z = fr-fx;( A4 A! D$ i5 ^( L5 q' r+ b( K: u
B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %調(diào)整A( v1 e; H: F* q$ U3 Q& L6 d/ b9 H( p
B=B1;
8 [) W2 ]& p* p# T2 Vn=n+1;: N" K/ X* |0 P2 B6 k
if(n>100000) %迭代步數(shù)控制: H2 v& I! ^3 ~) _$ p
disp('迭代步數(shù)太多,可能不收斂!');2 l0 X# U% ~. s9 y/ Z
return;
! j8 U7 q. K8 _) H a9 k( iend& S* y r/ r3 ^+ ]* d7 t
tol=norm(r-x0);3 ?9 a: j; ^5 n9 G% D F; b* ]
end* l) {2 R3 ^! [! }# F
問題:這個程序我是通過其他方法改變來的,現(xiàn)在想在這個基礎(chǔ)上增加一個求偏導(dǎo)的一個函數(shù)類似于“df=jacobian(f,[x1 x2]);%函數(shù)f的偏導(dǎo)”,可是加進去以后就會出現(xiàn)錯誤,改正好多次,都不行,后來實在不行我就加在了調(diào)用函數(shù)中,可是這么做,運行效率太低,唯恐老師會減分,所以希望各位前輩能給予實質(zhì)性的指點,謝謝! |
|