Tus*_*arg 12 matlab linear-algebra
我在解决Ax = B形式的系统时遇到了麻烦
该系统的解决方案应该是
x = inv(A)*B
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.
我尝试上面的代码行时收到以下错误消息:
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 1.156482e-018.
Run Code Online (Sandbox Code Playgroud)
似乎matlab在反转我指定的矩阵时遇到了麻烦.我试着通过输入inv(A)*A来验证反函数是否正常工作
这应该给出单位矩阵,但是我得到了相同的错误和一些垃圾数.
这是我正在使用的A矩阵:
A = [5/2 1/2 -1 0 0 -1/2 -1/2 0 0
1/2 1/2 0 0 0 -1/2 -1/2 0 0
-1 0 5/2 -1/2 -1 0 0 -1/2 1/2
0 0 -1/2 1/2 0 0 0 1/2 -1/2
0 0 -1 0 3/2 -1/2 1/2 0 0
-1/2 -1/2 0 0 -1/2 2 0 -1 0
-1/2 -1/2 0 0 1/2 0 1 0 0
0 0 -1/2 1/2 0 -1 0 2 0
0 0 1/2 -1/2 0 0 0 0 1]
Run Code Online (Sandbox Code Playgroud)
关于为什么这不起作用的任何想法?我还尝试将A转换为稀疏矩阵(稀疏(A)),然后运行inverse命令.没有骰子.
Ego*_*gon 20
问题确实存在于你的数学中.您提供的矩阵不是完全排名,因此它不可逆.您可以手动验证(没有花时间这样做),但MATLAB已经通过显示警告来指出这一点.
由于您正在使用浮点数,这有时会导致其他微妙的问题,其中一个可以在结果中看到det(A),这个问题的顺序是1e-16,即机器精度,或者在实践中为0.
通过执行以下rank功能,您可以看到此Matrix不是完全排名:rank(A) = 8.对于9x9矩阵,这确实意味着矩阵对于双精度而言是不可逆的(因为该rank函数考虑了机器精度).
如果要使用MATLAB获得与手动计算相对应的结果,可以使用符号工具箱及其vpa(可变精度算术)来解决可能的数值问题,但代价是计算速度较慢.
B = [5 1 -2 0 0 -1 -1 0 0;
1 1 0 0 0 -1 -1 0 0;
-2 0 5 -1 -2 0 0 -1 1;
0 0 -1 1 0 0 0 1 -1;
0 0 -2 0 3 -1 1 0 0;
-1 -1 0 0 -1 4 0 -2 0;
-1 -1 0 0 1 0 2 0 0;
0 0 -1 1 0 -2 0 4 0;
0 0 1 -1 0 0 0 0 2];
A = B/2;
size(A) % = [9 9]
det(A) % = -1.38777878078145e-17
rank(A) % = 8
C = vpa(A);
det(C) % = 0.0
rank(C) % = 8
Run Code Online (Sandbox Code Playgroud)
无论是VPA还是浮点,你都会得到等级为8,大小为[9 9]且行列式实际为0,即单数或不可逆.更改一些条目可能会使您的矩阵规则(非单数),但不能保证其工作,它将解决不同的问题.
为了解决实际问题A*x=b的x,你可以尝试使用mldivide(又名反斜杠运营商)或摩尔-彭罗斯伪逆:
x1 = A\b;
x2 = pinv(A)*b;
Run Code Online (Sandbox Code Playgroud)
但请记住,这样的系统没有唯一的解决方案,因此伪逆和反斜杠操作符可能(并且在这种情况下)将返回非常不同的解决方案,无论它们中的任何一个是否可接受,实际上取决于您的应用程序.
Kar*_*tel 11
这正是它所说的.矩阵是单数的,这意味着它不能真正倒置.并非所有矩阵都可以.
在几何术语中,您有一个矩阵可以将一个9维对象转换为另一个9维对象,但完全展平一个维度.这无法撤消; 没有办法说出在那个方向上拉出来的距离.
| 归档时间: |
|
| 查看次数: |
53810 次 |
| 最近记录: |