通常最优化的教材后面都会附有程序吧
%Function of the CG method
%What should be inputed are the start point 'xstart',
% the matrix A,vector b and tol
% It would give the solution x ,iterations and the iterative time
function [time,k,x]=normCG(xstart,A,b,tol)
x=xstart; Fx=05x'Ax-b'x;
tol=10^(-6); beta=1;
r=A'xstart-b; %r0
p=-r; %p0
stopc=norm(r,inf);
k=0;
tic;
while(stopc>tol && k<=2000)
r0=r;
p0=p;
rpinfang=r0'r0; %r(k)^2
fenmu=p0'Ap0;
alpha=rpinfang/fenmu; %alpha
x=x+alphap0; %x(k+1)
r=r0+alphaAp0; %r(k+1)
beta=(r'r)/rpinfang; %beta
p=-r+betap0; %p(k+1)
stopc=norm(r,inf);
k=k+1;
if mod(k,10)==0 fprintf(' k=%4d epsm=%93e \n',k,stopc); end;
end
toc;
time=toc;
% fprintf('The iterations is %4d',k);
你把function f=fun(x) 改为 function f=myfun(x),然后另存为myfun。m;再把[x,fval]=fmincon('fun',x0,A,b,Aeq,beq,lb,vb) 改为 [x,fval]=fmincon('myfun',x0,A,b,Aeq,beq,lb,vb) 就可以了。
但是运行结果好像有问题,请检查A,b,Aeq,beq,lb,vb是否合理。
已知问题:
1、调用fmincon的非线性约束函数缺少@符;
[x,fval]=fmincon(@mubiao,[],[],[],[],[],Lbnd,Ubnd,@yueshu,options);
2、未提供初值;
3、目标函数的最后一句symsum,真心看不懂楼主到底想要计算什么,表达式里面根本没有符号量啊?
fun=@(x1,x2)x1^2+x2^2+x1x2-3x1;
[x,fval]=fminunc(fun,[0 0])
这个更实用,能解决几乎所有求最小值的问题。
建议:取消syms,用数值积分方法先计算积分号里面的东西,而不要用符号积分算法。将下面这段:
syms zw1=mtt0/(4piMne(DLDT)^05);
w2=exp(xu/(2DL));
B=((ux/(2DL))^2+(uy)^2/(4DLDT))^05;
w3=2besselk(0,B);
w5=int((1/z)exp(-z-(B^2/(z4))),tu^2/(4DL),inf);
w4=double(w5);
替换为
w1=mtt0/(4piMne(DLDT)^05);w2=exp(xu/(2DL));
B=((ux/(2DL))^2+(uy)^2/(4DLDT))^05;
w3=2besselk(0,B);
ifun = @(z,B)(1/z)exp(-z-(B^2/(z4)));
w5=integral(@(z)ifun(z,B),tu^2/(4DL),inf);
w4=w5;
th1=zeros(36,2);
th1(:,2) = 1;
为了判断优化效果,我们对两种方式每轮执行1百万次,执行10轮,对比执行时间,结果如下:
其中,t1为优化前的时间,t2为优化后的执行时间。
可以看出优化前每轮平均执行时间在130~142秒左右,优化后每轮平均执行时间在095~102秒左右
符号计算的话用symsum函数。比如求和∑1/n^2(n从1到k)
syms n k
>> s=symsum(1/n^2,n,1,k)
s =
-Psi(1,k+1)+1/6pi^2
再比如求和∑n^2(n从1到k)
syms n k
>> s=symsum(n^2,n,1,k)
s =
1/3(k+1)^3-1/2(k+1)^2+1/6k+1/6
s=simplify(s)
s =
1/3k^3+1/2k^2+1/6k
而要用数值计算的话,应当用一个矩阵先把要求和的元素存起来,然后用sum函数。比如上面的两个例子
第一个为:
k=1000;
a=1/(1:k)^2%存储1,1/4,1/9,1/16
s=sum(a)
s =
16439
第二个为:
k=1000;
a=(1:k)^2;%存储1,4,9,16
s=sum(a)
以上就是关于最优化二次函数的共轭梯度法的matlab程序全部的内容,包括:最优化二次函数的共轭梯度法的matlab程序、matlab最优化问题:先建立fun.m文件 function f=fun(x) f=x(1)^3+x(2)^3+x(3)^3+x(4)^3; 再写主程序:、matlab有约束最优化程序纠错等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)