[已解决] 用solve求解复杂线性方程组时出现Empty sym: 0-by-1,不知道是方程组本身无解,还是有错误

[复制链接]
El_Reversal 发表于 2021-10-8 14:26:16
本帖最后由 El_Reversal 于 2021-10-8 14:45 编辑

原本有一个方程组,含有许多符号变量,依次用subs对这些变量赋值后,得到了方程组eqn,待求未知数为F1z~F4z,观察发现方程组是线性的,用solve求解。求解方程部分的程序如下:

  1. syms F1z F2z F3z F4z

  2. eqn =[
  3.                                                                                                                                                                                                                                                                                                                                                                                                                       F1z + F2z + F3z + F4z - 735 == 0;
  4.                                                                                                                            (3549*F1z)/10000 - (3549*F2z)/10000 - (3549*F3z)/10000 + (3549*F4z)/10000 + (538302428601027*cos(10683089/4294967296))/549755813888000 + (1367*F1z*sin(10683089/4294967296))/50000 + (1367*F2z*sin(10683089/4294967296))/50000 + (1367*F3z*sin(10683089/4294967296))/50000 + (1367*F4z*sin(10683089/4294967296))/50000 == 0;
  5.                                                                                                                                (1059*F3z)/2000 - (1059*F2z)/2000 - (1059*F1z)/2000 + (1059*F4z)/2000 + (538302428601027*sin(10683089/4294967296))/549755813888000 - (1367*F1z*cos(10683089/4294967296))/50000 - (1367*F2z*cos(10683089/4294967296))/50000 - (1367*F3z*cos(10683089/4294967296))/50000 - (1367*F4z*cos(10683089/4294967296))/50000 == 0;
  6. (345770579797848621*cos(10683089/4294967296))/3094850098213450687247810560000 - (3549*F1z*cos(10683089/4294967296))/100000 + (3549*F2z*cos(10683089/4294967296))/100000 + (3549*F3z*cos(10683089/4294967296))/100000 - (3549*F4z*cos(10683089/4294967296))/100000 + (1059*F1z*sin(10683089/4294967296))/20000 + (1059*F2z*sin(10683089/4294967296))/20000 - (1059*F3z*sin(10683089/4294967296))/20000 - (1059*F4z*sin(10683089/4294967296))/20000 == 0];

  7. F=solve(eqn,[F1z,F2z,F3z,F4z])
复制代码
结果为:
  1. F =

  2.   包含以下字段的 struct:

  3.     F1z: [0×1 sym]
  4.     F2z: [0×1 sym]
  5.     F3z: [0×1 sym]
  6.     F4z: [0×1 sym]
复制代码
尝试用vpa将eqn中各种符号和分数转换为小数:
  1. >> eqn=vpa(eqn)

  2. eqn =

  3.                                                                                                                                                                                      F1z + F2z + F3z + F4z - 735.0 == 0.0
  4.              0.35496800409222153882356567966561*F1z - 0.35483199590777846117643432033439*F2z - 0.35483199590777846117643432033439*F3z + 0.35496800409222153882356567966561*F4z + 0.9791633845213923992290006026451 == 0.0
  5.            0.50216008457504959357597940083906*F3z - 0.55683991542495040642402059916094*F2z - 0.55683991542495040642402059916094*F1z + 0.50216008457504959357597940083906*F4z + 0.002435527545201527418322617890567 == 0.0
  6. 0.0356215952858310316275162327182*F2z - 0.035358185140759306630603084342646*F1z + 0.035358185140759306630603084342646*F3z - 0.0356215952858310316275162327182*F4z + 0.00000000000011172415438532814571452992529173 == 0.0
复制代码
可见方程组已经被化成了线性非齐次的形式,再求解仍然是是同样结果,不知道是这个方程组无解还是我的求解方法有问题,若能得到大佬指点,不胜感激!
注:使用版本为2020B

最佳答案


TouAkira 发表于 2021-10-10 03:26:08
你的线性方程组的系数方阵的行列式的值接近零,或者说方阵不满秩
根据线性代数知识, 多元非齐次线性方程组 Matrix * VectorX == VectorB 有唯一解的充要条件,是其导出组 Matrix * VectorX == 0 只有零解(即要求系数矩阵满秩)
所以你这个线性方程组本身就无解

4 条回复


shihe 发表于 2021-10-9 20:14:38
无精确数值解解吧,解析解自然也不存在。

TouAkira 发表于 2021-10-10 03:26:08
你的线性方程组的系数方阵的行列式的值接近零,或者说方阵不满秩
根据线性代数知识, 多元非齐次线性方程组 Matrix * VectorX == VectorB 有唯一解的充要条件,是其导出组 Matrix * VectorX == 0 只有零解(即要求系数矩阵满秩)
所以你这个线性方程组本身就无解
回复此楼

El_Reversal 发表于 2021-10-10 21:41:26
TouAkira 发表于 2021-10-10 03:26
你的线性方程组的系数方阵的行列式的值接近零,或者说方阵不满秩
根据线性代数知识, 多元非齐次线性方程组 ...

您好,这个方程组是需要在仿真过程中求解的,他的系数矩阵会随着仿真的进行不断更新,有没有办法从eqn这个符号表达式中提取出方程的系数矩阵?

TouAkira 发表于 2021-10-11 09:49:18
El_Reversal 发表于 2021-10-10 09:41
您好,这个方程组是需要在仿真过程中求解的,他的系数矩阵会随着仿真的进行不断更新,有没有办法从eqn这 ...

可以,用 coeffs函数 即可。针对你这个算例
  1. Matrix = [];
  2. for ii = 1 : 1 : numel( eqn )
  3.     STR = char( eqn( ii ) );
  4.     Matrix( ii, : ) = coeffs( str2sym( STR( 1 : 1 : end - 4 ) ), [ F4z, F3z, F2z, F1z ] ); % 原eqn中含有 == 0这种不需要的部分,这里把该部分去掉。如果直接有左侧表达式不含 == 0,则可以直接用coeffs
  5. end
  6. disp( vpa( Matrix, 4 ) ); % 特别要注意Matrix每列与各自变量的对应情况!仔细核对其顺序
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表