最优化二次函数的共轭梯度法的matlab程序

最优化二次函数的共轭梯度法的matlab程序,第1张

通常最优化的教材后面都会附有程序吧

%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 z

w1=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有约束最优化程序纠错等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9460644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存