我在验证其他人的方法时,出现了这样的问题,人家文章中的结果是收敛的,但是我无论怎么改都不收敛,所以想麻烦大家帮我一起看看,那篇论文的基本思路是用HSS解AX+XB=C,即转化为解下面的两个方程:(图1)其中H(A)=1/2(A+A'),S(A)=1/2(A-A'),H(B)与S(B)同理。然后我写的程序如下:%用HSS解Sylester方程,其中内迭代用MATLAB自带的lyap函数function [ite_num re] = HSS_2(A,B,alpha,beta,tol,max_num)n=size(A,2);m=size(B,2);I=eye(n);E=eye(m);F=eye(m,n);X0 = zeros(m,n);H_A=(1/2)*(A+A');S_A=(1/2)*(A-A');H_B=(1/2)*(B+B');S_B=(1/2)*(B-B');A1=alpha*I+H_A;A2=alpha*I+S_A;A3=alpha*I-S_A;A4=alpha*I-H_A;B1=beta*E+H_B;B2=beta*E+S_B;B3=beta*E-S_B;B4=beta*E-H_B;R_k = norm(F-A*X0-X0*B,'fro');eps_k=1;R_0=R_k;re(1) = eps_k;ite_num = 1;while ite_num < max_num && eps_k > tol C1=A3*X0+X0*B3+F; X1=lyap(A1,B1,C1);%计算第二个式子 C2=A4*X1+X1*B4+F; X0=lyap(A2,B2,C2); R_k = norm(F-A*X0-X0*B,'fro'); eps_k=R_k/R_0; ite_num = ite_num + 1; re(ite_num) = eps_k;endite_num = ite_num - 1;主程序是:clear allclcclose alltol = 1e-6; max_num = 200;A=SPD2(16,0.1);B=A;n=size(A,2);m=size(B,2);for k = 1:20 a(k)=0.1*k; b(k)=a(k); [ite(k) re] = HSS_2(A,B,a(k),b(k),tol,max_num);end %Select the alpha corresponding to the minimum iteration number [~,num] = min(ite);alpha = a(num);beta = b(num);[ite_num re] = HSS_2(A,B,alpha,beta,tol,max_num);disp([' '])disp([ 'Output result'])disp([' '])disp([' The optimum acceleration parameter a: ' num2str(alpha) ])disp([' '])disp([' The optimum acceleration parameter b: ' num2str(beta) ])disp([' '])disp([' The fastest number of iteration : ' num2str(ite_num) ])% Plot the k-step iteration residualssemilogy(re,'k.-','LineWidth',0.8)title([ 'n = ',num2str(n),', \alpha = ',num2str(alpha)]);xlabel('Iterative numbers ');ylabel('Residual');legend({'HSS'},1)% Setting of rectangular coordinate system parameterset(get(gca,'title'), 'FontSize', 10,'FontName','Times New Roman');set(get(gca,'XLabel'),'FontSize',10,'FontName','Times New Roman');set(get(gca,'YLabel'),'FontSize',10,'FontName','Times New Roman');xlim([1 ite_num])shg然后里面涉及到的例子是:% A = M + 2rN + (100/((n+1)^2)) I% M = tridiag(-1,2,-1)% N = tridiag(0.5,0,-0.5)function A = SPD2(n,r)A = diag((-1+r)*ones(n-1,1),-1) + diag((-1-r)*ones(n-1,1),1) + (2+100/((n+1)^2))*eye(n);我得到的相对误差的图像是 (图2)我自己研究了好久多不知道我错在哪,但肯定是某一点错了,所以想麻烦各位帮我看看了,我曾经以为是F的问题,然后我试着换了F,但最后得到的R_k居然是一样的,这就更让我纳闷了,所以。。。辛苦大家了,谢谢!!!
help lyap看下lyap函数的用法,
lyap(A, B, C)求解的是AX+XB+C=0,而不是AX+XB=C。所以你HSS_2函数中循环的两行应该改成:
...用matlab计算数值解误差时L无穷误差是对的,但L2误差是错,这是哪里原因...
你的L2精度要求太高了吧 比如说如果目前你认为误差小于a就是对的, 那你改成 10*a, 不行就100*a 找到一个更合理的界限
matlab涉及小数运算精度问题
matlab计算时默认的采用double类型的数据,所以绝大多数的数值都是存在误差的。在比较两个数是否相等时,就判断这两个数的差是否在误差内,在内部就认为想等,在外部就认为不等。你出现的这个问题正好是由于这个原因,d1=220-N3 d1= 2.842170943040401e-014 而d2=eps(220)=2.842170943040401e-014 ...
matlab仿真出现误差的原因
管压降。matlab仿真中电阻电压的理论值应为36V,实际输出略小于36V,造成此误差的原因是半导体器件导通时存在管压降,会使输出电压小于理想结果,出现误差。
帮忙看下,这个matlab的错误怎么回事?
你好,这是因为浮点数的原因。一般来说,计算机在内部运算时,是用二进制参与运算的,而表示浮点数时会产生误差,特别是表示小数时不能精确。0.1化为二进制如下:0.1(十进制) = 0.0001100110011001(二进制),反过来转换如下:0.0001100110011001(二进制) = 0.0999908447265625(十进制),可以看出是不相...
我用matlab计算 10^(-5) 减去 0.00001为什么不是0 呢?
matlab算出来就是有误差的,你可以在主界面中输入eps,会显示matlab所能识别的最小的数,你得到的结果比eps还小,所以对于matlab来说,就是0了
保留4位有效数字,matlab中误差限Tol是多少
你所说的是在什么地方的误差限?误差限有绝对误差和相对误差之分。如果是绝对误差,决定的是精确到几位小数,并不意味着有效数字的位数;而相对误差则决定有效数字的位数,4位的话取10^-4就可以了。
matlab 计算的误差
不是忽略,是运算精度就这么多,达不到再高要求了。exp(50)\/2 是21次方数,exp(-50)2是负22次方数,加一起,小数点左边要22+位,右边23+位,做不到的。。。
MATLAB中quad的误差问题
0,26.91)=0.9124是2017次。不出意外的话quad(y,0,26.9)原本应该计算2007次左右才对。在这里出现了程序bug,要深入到quad的源代码中才能排除问题。另,quad(y,26.9,26.89)=0.0038计算了函数13次,数值0.0038,基本正确;quad(y,26.91,26.9)=0.0061计算了函数13次,数值0.0061也基本...
为什么matlab在判断含小数的变量的算数运算结果是否等于某常量时不正确...
当你使用 == 运算符来比较两个浮点数时,实际上是在尝试进行精确比较。然而,由于浮点数的舍入误差,这种比较可能会失败。通常情况下,推荐使用一个小的容差值来进行比较,例如判断两个浮点数是否在某个很小的范围内接近,而不是进行精确的相等比较。在Matlab中,你可以使用 abs(a - b) < epsilon ...
关于数值计算之误差计算的matlab实验
首先明确一下,你的两个函数如果写在同一个M文件中,肯定是dsh1在前面(如果是写在两个文件里就不存在前后的问题了)。出现两个 f 的原因是,你在下面这句里:y=(feval(fu,x+h)-feval(fu,x))\/h;使用 feval 调用了两次函数 f ,而在函数 f 中的赋值语句 f=x.^3-log(2.*x)+1.\/x...