Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当矩阵的所有项都是变量时,如何在matlab中求出矩阵的特征值?_Matlab_Eigenvalue_Function Handle - Fatal编程技术网

当矩阵的所有项都是变量时,如何在matlab中求出矩阵的特征值?

当矩阵的所有项都是变量时,如何在matlab中求出矩阵的特征值?,matlab,eigenvalue,function-handle,Matlab,Eigenvalue,Function Handle,我有一个矩阵,其中有一组未知常数,如下所示: a*b -c -d 0 -c e -a -b-d -d -a d -e 0 -b-d -e a 正如您可能意识到的,它是关于对角线对称的,因此,对角线值都是正的。所有常量都大于0 我想在matlab中为特征值解决这个问题。我该怎么做呢?我不知道a、b、c、d和e的值。我想这样做: d = eig(@getMatrix) 但是eig函

我有一个矩阵,其中有一组未知常数,如下所示:

  a*b     -c     -d     0
   -c      e     -a    -b-d
   -d     -a      d    -e
    0     -b-d   -e     a
正如您可能意识到的,它是关于对角线对称的,因此,对角线值都是正的。所有常量都大于0

我想在matlab中为特征值解决这个问题。我该怎么做呢?我不知道a、b、c、d和e的值。我想这样做:

d = eig(@getMatrix)
但是eig函数不接受函数句柄。

在MATLAB中没有问题

>> syms a b c d e
>> M = [a*b     -c     -d     0
   -c      e     -a    -b-d
   -d     -a      d    -e
    0     -b-d   -e     a];

>> eig(M)
ans =
 a/4 + d/4 + e/4 + (a*b)/4 - ((51*a*d^3)/16 - (117*a^4*b)/16 + (27*a^3*d)/16 + (27*a*e^3)/16 + (57*b*d^3)/2 + (27*a^3*e)/16 + (27*d*e^3)/16 + (51*d^3*e)/16 + 6*((4*(2*b*d - (a*e)/4 - (a*d)/4 - (d*e)/4 - (a^2*b)/4 + (11*a^2)/8 + b^2 + c^2 + (19*d^2)/8 + (11*e^2)/8 + (3*a^2*b^2)/8 - (a*b*d)/4 - (a*b*e)/4)*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + 
...

(a*b*c^2*e)/8 + (3*a*b*d*e^2)/64 + (11*a*b*d^2*e)/64 + (a*b^2*d*e)/4 - (33*a^2*b*d*e)/32 - (5*a^2*b^2*d*e)/64 + (a*b*d*e)/4 + (a*c*d*e)/2 - 2*b*c*d*e) - 256*((17*a*d^3)/64 - (39*a^4*b)/64 + (9*a^3*d)/64 + (9*a*e^3)/64 + (19*b*d^3)/8 + (9*a^3*e)/64 + (9*d*e^3)/64 + (17*d^3*e)/64 + (45*a^4)/256 + (285*d^4)/256 + (45*e^4)/256 - (a^2*b^2)/16 + (a^2*b^3)/8 + (3*a^2*b^4)/16 + (31*a^4*b^2)/128 + (a^4*b^3)/64 - (3*a^4*b^4)/256 + (3*a^2*c^2)/16 + (15*a^2*d^2)/128 - (9*a^2*e^2)/128 + (19*b^2*d^2)/16 - (b^2*e^2)/16 + (3*c^2*d^2)/16 + (15*c^2*e^2)/16 + (15*d^2*e^2)/1...

Output truncated.  Text exceeds maximum line length of 25,000 characters for Command Window display.
我删除了很多。诚然,它相当混乱和冗长,但你真的能期待更好吗

编辑:我应该指出,如此长的扩展公式在计算精度方面可能是危险的。我见过人们盲目地使用如此混乱的表达式,用Fortran或MATLAB计算它。他们认为,因为它是“象征性的”,所以它也是精确的。当进行数值计算时,这完全是一个谬误


在这些项中很可能存在巨大的减法相消,巨大的正项和负项几乎相互抵消,留下一个微小的结果,由于浮点计算的动态范围有限,结果基本上毫无价值。当心。至少,比较使用相同表达式进行的单精度和双精度计算。如果它们有任何显著的差异,请尝试扩展精度版本,以验证双打没有问题。如果您没有测试过这样的表达式并对其进行过广泛的验证,请不要相信它。

我认为您需要符号数学工具箱来实现这一点。如果您有它,那么
eig
函数可以使用符号矩阵作为输入。参见文档Yep,这是一个符号问题,而MATLAB是一个数值工具。你需要的是一个计算机代数系统。你应该在一个计算机代数系统,比如Maxima中这样做。Matlab不是进行符号运算的最佳工具。@ColinTBowers如何获得工具箱?我正在使用一台预装了matlab的学校电脑。从他们的网站上看,我想MATLAB应该已经有了它。如果是这种情况,如何使用它?@user972276在Matlab命令窗口中键入
ver
。这将列出已安装的工具箱。如果符号数学工具箱未列出,但您认为应该列出,请告知本地系统管理员。关于工具箱的实际使用,恐怕我无能为力。正如其他几条评论所指出的,Matlab不是符号数学的好工具。我个人使用,但如果我重新开始我的生活,我会使用或