|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)7 z$ w, o/ ]! P! T
function [r,n]=mulDFP(F,x0,B,eps)
1 q1 q9 F. f6 e3 {& n%用拟牛顿法中的DFP法中求极小点和极小值。( S* ~ }$ g/ | G
%Designed by GAO,Mechanical Engineering College8 o& N; c, X, X, Q8 l9 S
%Shenyang University of Technology6 d7 j5 l$ j( P
%November,2015
3 G) [4 M8 x3 z' q- z9 L- I9 x) r%调用格式:/ W! t' {1 _. k5 Q+ ~, o
%syms x1 x2;7 N e4 X+ }9 K; s J- {
%z=表达式;
- V! _' _: _, n: u, R% j%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
5 w2 x3 A" a, o/ n* W$ a%X0=[给定初始值];6 [' n; A: r$ T) U4 U+ K) e/ `& M% a
%f=[zx1;zx2];3 [: V" S2 h" p8 r
%[n,r]=mulDFP(f,x0)
; E, t, E5 A D4 D# K5 G0 K9 Jif nargin==2
* q9 m& G% n9 V# E; h) [% wl = length(x0);
, z9 s* P3 g, wB=eye(l); %A取为单位阵
0 }: Y; `& X% P+ b7 V/ F, m. ^eps=1.0e-4;7 d( z* d8 r3 P
else1 N, V" W3 L- n- `4 a+ p
if nargin==3# N, S; q8 J `* Z, [2 L0 t( q
eps=1.0e-4;; B2 R( n% g- U9 g
end$ C _8 p; }; f+ @
end) L; B# y* E' y8 f- g
fx = subs(F,findsym(F),x0);
2 u, a8 i v/ [, Rr=transpose(x0)-B*fx; V& h8 e+ j1 I& e
n=1;
* o! i1 W: u/ itol=1;
& S. j7 ?1 l3 l" ~2 A/ zwhile tol>eps6 t0 e, Z0 m( K+ @1 R2 F7 U
x0=r;
: ^5 n# E, [0 s2 r$ Hfx = subs(F,findsym(F),x0);
$ t" l5 Z4 n" Z) Ur=x0-B*fx;
( w9 V$ b8 e% `( l) ]5 Jy=r-x0;. a F& u! R9 I9 A
fr = subs(F,findsym(F),r);2 q ]4 j9 H3 x b0 x. p ^0 O! p; H
z = fr-fx;
) m( K& f3 y" K. A$ C$ X' iB1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A
+ T! ]" |& |$ T5 l, n/ S: fB=B1;, C* J6 S; U/ g. h, M
n=n+1;8 x0 f, @+ b! c( N w" {
if(n>100000) %迭代步数控制3 m* D# S. o- k3 b9 G1 r
disp('迭代步数太多,可能不收敛!');0 N1 O9 B& u0 Y$ _: M7 Y
return;) ^" O7 v2 B! f4 N: z$ u
end
& z% R/ N. \4 _& W1 [tol=norm(r-x0);8 O! q5 I% O! q {
end
0 ^2 _$ ?* t0 N4 p5 [问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|