你的这个 执行结果是生成二维元胞数组 r_{2}=[fx1_2;fx2_2];
我猜你用这个的本意是由可做下标的r_{k},其实循环中不用这样做做下标,只要找个中间变量循环更新一次变量值就可以了 ,帮你改好了,自己编程序要学会调试找错哦
syms x1 x2 k
f=(3/2)(x1^2)+(1/2)(x2^2)-x1x2-2x1;
A=[3 -1;-1 1];
fx1=diff(f,x1);
fx2=diff(f,x2);
fx11=subs(fx1,{x1,x2}, {-2,4});
fx21=subs(fx2,{x1,x2},{-2,4});
x_1=[-2;4];
r1=[fx11;fx21];
p1=-r1;
t1=-((r1)'p1)/((Ap1)'p1);
x_2=x_1+t1p1;
xx={x_2(1),x_2(2)};
fx12=subs(fx1,{x1,x2}, xx);
fx22=subs(fx2,{x1,x2},xx);
r2=[fx12;fx22];
%M=r_{2};
for k=2:10
while norm(r2)>=001
a1=((r2)'r2)/((r1)'r1);
p2=-(r2)+(a1)(p1);
t2=-((r2)'p2)/((Ap2)'(p2));
x_3=x_2+((t2)(p2));
xx={x_2(1),x_2(2)};
fx12=subs(fx1,{x1,x2},xx);
fx22=subs(fx2,{x1,x2},xx);
r2=[fx12;fx22];
x_2=x_3;
end
end
optx=(x_2)
通常最优化的教材后面都会附有程序吧
%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);
conj是matlab已有的函数,你这里的函数名也叫conj,运行时matlab会调用matlab原有的conj函数,由于输入参数过多,当然报错>>doc conj
就会看到帮助文档
conj Symbolic complex conjugate
Syntax conj(X)
Description conj(X) is the complex conjugate of X
For a complex X, conj(X) = real(X)- iimag(X)
所以先把函数名字和函数M文件名字改掉,再运行函数,不过我想你这里的函数体里可能仍然会报错!
你i是不是已经被定义为变量了,正常i就是复数单位,可以这样表示的
MATLAB复数处理的常用函数
一、创建复数
1、赋值语句直接产生复数。
2、complex(a,b):该函数产生复数a+bi。
二、求实部
1、real(z):该函数求复数的实部。
三、求虚部
1、imag(z):求复数z的虚部。
四、求复数的值
1、abs(z):求复数z的值。
五、求复数的角度
1、angle(z):求复数z的角度。
六、求共轭复数
1、conj(z):求复数的共轭复数。
这个题目昨天就看到了,怎么会没人回答呢?
原则上,定义了实数范围的4个变量,并不能保证后面的运算结果不产生复数
但是本题中:sqrt(4Dx^2+Jy^2+Jz^2+2JyJz)=sqrt(4Dx^2+(Jy+Jz)^2)
可以看出:根号下的表达式的结果是恒≥0的,应该是不会产生虚数的
所以这里的conj-----求共轭复数,是没有意义的。
%共轭梯度法 FR
% G为对称正定矩阵,X是初始点,e为精度
%a是精确线搜索步长
function [m2,a,d,X,g1,f1] = conjgrad(G,b,c,X,e)
n=length(G);
if n==2
format long e %rat
syms x1 x2
f=1/2[x1,x2]G[x1;x2]+b'[x1;x2]+c;
g=[diff(f,x1);diff(f,x2)];
g1=subs(subs(g,x1,X(1,1)),x2,X(2,1));
d=-g1;
a=-(d'g1)/(d'Gd);% a=-((X(:,1)'Gd+b'd)/(d'Gd)); a=g1(:,1)'g1(:,1)/(d(:,1)'Gd(:,1));
X(:,2)=X(:,1)+ad;
g1=[g1 subs(subs(g,x1,X(1,2)),x2,X(2,2))];
m1=norm(g1(:,1));m2=norm(g1(:,2));
k=(m2/m1)^2;
i=2;
while m2>=e
d(:,i)=-g1(:,i)+k(i-1)d(:,i-1);
a(i)=-(d(:,i)'g1(:,i))/(d(:,i)'Gd(:,i));
%a1(i)=-((X(:,i)'Gd(:,i)+b'd(:,i))/(d(:,i)'Gd(:,i)));a(i)=g1(:,i)'g1(:,i)/(d(:,i)'Gd(:,i));
X(:,i+1)=X(:,i)+a(i)d(:,i);
g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))];
m1=m2;m2=norm(g1(:,i+1));
k(i)=(m2/m1)^2;
i=i+1;
end
f1=subs(subs(f,x1,X(1,i)),x2,X(2,i));
elseif n==3
format long
syms x1 x2 x3
f=1/2[x1,x2,x3]G[x1;x2;x3]+b'[x1;x2;x3]+c;
g=[diff(f,x1);diff(f,x2);diff(f,x3)];
g1=subs(subs(subs(g,x1,X(1,1)),x2,X(2,1)),x3,X(3,1));
d=-g1;
a=-((X(:,1)'Gd+b'd)/(d'Gd));
X(:,2)=X(:,1)+ad;
g1=[g1 subs(subs(subs(g,x1,X(1,2)),x2,X(2,2)),x3,X(3,2))];
k=(norm(g1(:,2))/norm(g1(:,1)))^2;
m=norm(g1(:,2));
i=2;
while m>=e
d(:,i)=-g1(:,i)+kd(:,i-1);
a(i)=-((X(:,i)'Gd(:,i)+b'd(:,i))/(d(:,i)'Gd(:,i)));
X(:,i+1)=X(:,i)+a(i)d(:,i);
g1=[g1 subs(subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1)),x3,X(3,i+1))];
k=(norm(g1(:,i+1))/norm(g1(:,i)))^2;
m=norm(g1(:,i+1));
i=i+1;
end
f1=subs(subs(subs(f,x1,X(1,i)),x2,X(2,i)),x3,X(3,i));
end
以上就是关于在matlab中,运用共轭梯度求二次函数极小点,程序老是会出现以下状况,请大仙帮我看看,哪边错了感谢全部的内容,包括:在matlab中,运用共轭梯度求二次函数极小点,程序老是会出现以下状况,请大仙帮我看看,哪边错了感谢、最优化二次函数的共轭梯度法的matlab程序、求助Matlab一个共轭梯度法的程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)