|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)7 C7 t) }6 C3 o( p! j
function [r,n]=mulDFP(F,x0,B,eps)
) } @7 w! C8 z3 e! D7 `%用拟牛顿法中的DFP法中求极小点和极小值。: [" W- |2 l2 v7 ]! }
%Designed by GAO,Mechanical Engineering College
E) a- L1 D/ _3 |%Shenyang University of Technology7 f" \% u) e, Q5 {
%November,2015
" Z( k1 d8 o% K! O4 h%调用格式:
+ G7 Q$ C/ w0 B4 v7 v%syms x1 x2;3 Z8 z( v" ~' g9 |' i. A$ b* y/ W
%z=表达式;3 b8 i. B/ Y; f# f5 ?. g
%zx1=simple(diff(z,x1)),zx2=diff(z,x2)# [, ^* a$ M: O! ?
%X0=[给定初始值];
( ~& P2 \9 c3 W%f=[zx1;zx2];
; Q0 S9 Z i" M: e4 O4 e8 v1 A%[n,r]=mulDFP(f,x0)% s" U: m! ], {* Z; r" T9 ~( m2 [
if nargin==24 a& Y' |5 k0 C: w5 ]
l = length(x0);
* y4 C8 y: W4 g3 ]4 AB=eye(l); %A取为单位阵; |) d2 J: F- f! V6 u5 f* T4 n. d
eps=1.0e-4;* J8 F1 t# l6 F( u
else
, @, }6 E7 Y* x4 Q- ^, pif nargin==3$ Q h% f4 {0 E r% {0 `
eps=1.0e-4;
4 N4 M: \% `+ \4 S8 Fend i# U. Z7 P6 G P' i* }( W
end& q/ V7 L( x: ?* V7 o; u1 T! `: C/ d
fx = subs(F,findsym(F),x0);
. q5 o' i, L& ~! s6 a/ l* z7 `r=transpose(x0)-B*fx;
( \) h: x7 d# I x- i hn=1;2 \$ m+ f O& N) @1 @
tol=1;8 O( a0 N% o9 x
while tol>eps
s( K9 t' j* I4 I0 A% ?/ U1 Hx0=r;
# X0 B( R4 m/ k& B; J# W$ ?fx = subs(F,findsym(F),x0);/ |/ U7 @. c }( O
r=x0-B*fx;( k, U, Z @5 P8 t2 Z: {
y=r-x0; X6 q2 U- B/ j# k& n: L+ q1 a
fr = subs(F,findsym(F),r);
6 p+ d& d2 y r0 D' m) G* b4 Cz = fr-fx;
% g) }) `+ i- h" g% C. h% {B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A" W9 Z8 |' o2 X) Q$ g& T* M% e4 k
B=B1;/ u+ m$ H! Z7 a, e. F
n=n+1;
, G( Z- }9 J: o+ N7 c) ?if(n>100000) %迭代步数控制/ U" N; q* G; d, f8 X# b5 {- B
disp('迭代步数太多,可能不收敛!');: K( U! s9 ?4 W7 g# b3 N' p$ v/ Q
return;4 Z# m: O' }2 ?, T
end
4 {$ [5 ^0 B. X2 S( G$ xtol=norm(r-x0);4 S" A0 Y3 t1 A; B
end% m( q e- F- [; {* i3 f: \2 u1 A
问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|