展翅翱翔with 发表于 2015-11-21 23:09:14

请教MATLAB编程?

优化设计老师布置用MATLAB对变尺度法进行MATLAB编程(也叫拟牛顿法),我是用拟牛顿法中的BFD法进行编程,程序如下:(问题在程序后面)
function =mulDFP(F,x0,B,eps)
%用拟牛顿法中的DFP法中求极小点和极小值。
%Designed by GAO,Mechanical Engineering College
%Shenyang University of Technology
%November,2015
%调用格式:
%syms x1 x2;
%z=表达式;
%zx1=simple(diff(z,x1)),zx2=diff(z,x2)
%X0=[给定初始值];
%f=;
%=mulDFP(f,x0)
if nargin==2
l = length(x0);
B=eye(l); %A取为单位阵
eps=1.0e-4;
else
if nargin==3
eps=1.0e-4;
end
end
fx = subs(F,findsym(F),x0);
r=transpose(x0)-B*fx;
n=1;
tol=1;
while tol>eps
x0=r;
fx = subs(F,findsym(F),x0);
r=x0-B*fx;
y=r-x0;
fr = subs(F,findsym(F),r);
z = fr-fx;
B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整A
B=B1;
n=n+1;
if(n>100000) %迭代步数控制
disp('迭代步数太多,可能不收敛!');
return;
end
tol=norm(r-x0);
end
问题:这个程序我是通过其他方法改变来的,现在想在这个基础上增加一个求偏导的一个函数类似于“df=jacobian(f,);%函数f的偏导”,可是加进去以后就会出现错误,改正好多次,都不行,后来实在不行我就加在了调用函数中,可是这么做,运行效率太低,唯恐老师会减分,所以希望各位前辈能给予实质性的指点,谢谢!
页: [1]
查看完整版本: 请教MATLAB编程?