|
优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)8 d- }8 ^2 |. G6 a9 ]6 t- y! R+ I function [r,n]=mulDFP(F,x0,B,eps)$ S1 a6 `, V& q/ s. p, O %用拟牛顿法中的DFP法中求极小点和极小值。 $ @8 u! r2 l- p+ e5 R$ \%Designed by GAO,Mechanical Engineering College! N" d9 T$ n7 }: [9 M$ } %Shenyang University of Technology0 ^! w1 D; ?: R, b- s& ^ %November,20155 U5 _# x3 |7 R- S %调用格式: 9 Q" |: G6 W- f5 T%syms x1 x2;8 o3 J$ E0 p# ]6 I: @" v %z=表达式; # X$ L5 r% D x+ \' P' \%zx1=simple(diff(z,x1)),zx2=diff(z,x2) 5 `* o: k1 f0 n7 f0 p4 z" `8 |$ l; y6 y3 k%X0=[给定初始值]; & U* T* E& T6 O7 G5 q%f=[zx1;zx2]; 1 t: [! u- p: C. r7 X0 ]4 E%[n,r]=mulDFP(f,x0)' x. r5 k0 W( e if nargin==28 i, c$ i3 T, Y l = length(x0); ; Y1 M+ ]& b/ H/ TB=eye(l); %A取为单位阵0 k# Z1 j$ Y9 O {7 k; z0 `8 v eps=1.0e-4;8 y7 T; I0 f9 t4 L6 Z4 F& \5 o else 0 H2 ?5 f5 H' aif nargin==3 1 o* ^$ T6 V3 {6 X4 @$ D$ eeps=1.0e-4;% d7 w( l. u# ]+ q' C! P end & j- o* R1 b0 }" R8 ]end 9 P( s% W6 E E* lfx = subs(F,findsym(F),x0); : c0 L: }5 ]0 q% m" ar=transpose(x0)-B*fx; " F6 l1 x! H9 \4 E1 { b8 Wn=1; ) D6 }, Y* \3 {( @tol=1; 1 K, w0 t0 E: o* Mwhile tol>eps : z" Y' D$ v) v9 x5 H. P, g. _x0=r; ( |* J O% B! |+ D+ v& S' ~3 pfx = subs(F,findsym(F),x0); 7 o& I3 h6 K: ur=x0-B*fx; ; ^, L0 W B7 q8 ?$ Cy=r-x0; 2 O2 p( m" A ^4 h! D% Hfr = subs(F,findsym(F),r);' h" C! B) j) ?4 d* R* @ z = fr-fx; : P8 q8 W# d; d# E" ?B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A9 N' {6 A/ q# T) l' O B=B1;8 E% E2 m$ p7 g4 G8 J n=n+1;* \2 `- a: h' E5 l' [# v6 L if(n>100000) %迭代步数控制 ! \& a9 m2 X5 F; i/ n* zdisp('迭代步数太多,可能不收敛!'); , z# R: p. Y6 }, l' X! ^- j0 ireturn; ; p p1 P: a4 Qend ; b0 g* M! ]8 N, z; B: b. _7 ^tol=norm(r-x0);2 H4 c/ {! z) y# s* M end0 B' z* a$ M" z4 b! l 问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,[x1 x2]);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢! |
|