查看: 639|回复: 3|关注: 0

[已答复] 如何解决matlab与VS计算结果不一致的问题?

[复制链接]

新手

38 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
发表于 2020-5-19 00:04:10 | 显示全部楼层 |阅读模式
本帖最后由 王观道 于 2020-5-19 11:15 编辑

在进行matlab进行最优值(伪逆方法)求解的过程中惊奇的发现与VS计算结果不一致的现象,具体描述如下:
经过一步步的打印输出,发现在进行矩阵运算的过程中,matlab与VS难免存在一些细小的误差,但是当进行矩阵求逆的操作过程中,细小的误差得到极大的放大,最终得到的结果也就便不同。由下图看出,在循环第一次走到这个求逆的时候,还没有出现问题,但是在第循环第二次的时便出现问题。(matlab与vs计算结果对比图片在本贴最下方)

事实证明vs计算结果符合实际,就一直在matlab寻找问题,于是我就想着可能是精度问题吧,就采用vpa函数和统一matlab和VS之间的变量类型(double),但是均以失败告终。
最后希望高人来指点一下呀,感谢感谢!!!
  1. clc
  2. close all
  3. %%首先进行变量及各个矩阵的赋值
  4. global L rpm_lim K_fw K_rw alfa  
  5. n1=[];n2=[];n3=[];n4=[];f1=[];f2=[];f3=[];f4=[];
  6. L=0.093; rpm_lim=4800; K_fw=9.1825*10^(-7); K_rw=8.1959*10^(-7); alfa=45*pi/180;
  7. f_lim=[20; 20; 20; 20];
  8. n_hat=[-1;1;1;-1];
  9. H=[ cos(alfa) -cos(alfa) cos(alfa) -cos(alfa) 1 1 1;
  10.     sin(alfa) sin(alfa) -sin(alfa) -sin(alfa) 1 1 1;
  11.     -L -L -L -L 1 1 1];
  12. G=[1 0 0 0 0 0 0;
  13.     0 1 0 0 0 0 0;
  14.     0 0 1 0 0 0 0;
  15.     0 0 0 1 0 0 0;
  16.     0 0 0 0 1000000 0 0;
  17.     0 0 0 0 0 1000000 0;
  18.     0 0 0 0 0 0 1000000*1000/L];
  19. H_mod_pinv=zeros(7,3);
  20. f=zeros(4,1);
  21. tau_d=[0;0;20];

  22. %%开始进行各个矩阵之间的运算
  23. H_pinv=pinv(G)*H'*pinv(H*pinv(G)*H');
  24.     sigma=H_pinv*tau_d;
  25.     sigma_sat=zeros(7,1);
  26.     H_mod=H;
  27.    
  28.     for i=1:1:4%为了逐个修正H_mod      
  29.     f(1)=sigma(1); f(2)=sigma(2); f(3)=sigma(3); f(4)=sigma(4);
  30.   %% 在每次循环的过程中对H_mod进行修正
  31.   if i==1
  32.     H_mod(:,1)=0; sigma_sat(1) =-20;
  33.   end
  34.   if i==2
  35.      H_mod(:,3)=0;
  36.       sigma_sat(3) =-20;
  37.   end
  38.   if i==3
  39.       H_mod(:,2)=0;
  40.       sigma_sat(2) =-20;
  41.   end
  42.   if i==4
  43.      H_mod(:,4)=0;
  44.       sigma_sat(4) =-20;
  45.   end
  46. %%
  47. %%%%%%%%%%%%下一行为出现问题代码%%%%%%%%%%%%%%%%%%%%%%%
  48.     H_mod_pinv=pinv(G)*(H_mod')*pinv((H_mod*pinv(G)*(H_mod)'));
  49.     sigma=sigma_sat+H_mod_pinv*(tau_d-H*sigma_sat);
  50. %%   
  51. %%%%%%%%%%%%以下输出为了显示问题所在%%%%%%%%%%%%%%%%%%%%%%%
  52.     A=(H_mod*pinv(G)*(H_mod)');%A为原矩阵,对比matlab与vs A矩阵有较小差异,但是已经为下一步求逆埋下隐患
  53.      B=pinv(A);                  %循环第一次的时候,A矩阵也有较小差异,但是求逆基本一致,循环第二次出现问题
  54.     disp(A)
  55.     disp(B)
  56.     disp(sigma')
  57.     end
  58.    
复制代码


循环差异指示.png
高精度显示.png
回复主题 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

中级

685 麦片

财富积分


5001500


26

主题

364

帖子

79

最佳答案
  • 关注者: 11
发表于 2020-5-19 08:42:30 | 显示全部楼层
看以下你的矩阵G是病态矩阵,他的条件数cond(G)很大1.0753e+10;他的秩为rank(G)=7;典型特征就是:求解方程组时如果对数据进行较小的扰动,则得出的结果具有很大波动,这样的矩阵称为病态矩阵。线性代数里面的内容;只是依稀记得存在这种问题,有解决方法的,你具体可以找下资料。
ps:可以找下其他大牛解决下。
回复此楼 已获打赏: 0 积分

举报

新手

38 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2020-5-19 10:21:35 | 显示全部楼层
15631202458 发表于 2020-5-19 08:42
看以下你的矩阵G是病态矩阵,他的条件数cond(G)很大1.0753e+10;他的秩为rank(G)=7;典型特征就是:求解 ...

感谢提出病态矩阵的问题,但是现在的问题是,1.不太明白同样的矩阵在vs之中为什么能够求解出符合实际的正常值,2.刚刚我也尝试一下改变矩阵G(条件数降为三位数),但是问题依然存在。
回复此楼 已获打赏: 0 积分

举报

新手

38 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2020-5-21 11:40:36 | 显示全部楼层
15631202458 发表于 2020-5-19 08:42
看以下你的矩阵G是病态矩阵,他的条件数cond(G)很大1.0753e+10;他的秩为rank(G)=7;典型特征就是:求解 ...

您好,不知道matlab有没有那种调整整体默认运算精度的设置选项,还是感觉在运算精度方面有问题
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表