use*_*971 4 python numpy matrix linear-algebra scipy
目标
给定一组点,我试图找到满足所提供的所有点的线性方程的系数.
例如,如果我想找到线性方程(ax + by + c = z):
3x + 2y + 2 = z
Run Code Online (Sandbox Code Playgroud)
我需要至少三个三维点:
(2, 2, 12)
(3, 4, 19)
(4, 5, 24)
Run Code Online (Sandbox Code Playgroud)
给定坐标(x,y,z)的足够点,我应该能够使用高斯消元法找到(a,b,c).
但是,我认为我在特殊情况下遇到了解决矩阵的问题.你可以在这里查看我在python实现的第一次尝试:https://gist.github.com/anonymous/8188272
我们来看几个例子......
数据集1
使用以下"手工制作"点(x,y,z):
(2, 2, 12)
(3, 4, 19)
(4, 5, 24)
Run Code Online (Sandbox Code Playgroud)
对以下矩阵执行LU分解:
[[ 2. 2. 1. 12.]
[ 3. 4. 1. 19.]
[ 4. 5. 1. 24.]]
Run Code Online (Sandbox Code Playgroud)
返回解决U矩阵:
[[ 4. 5. 1. 24. ]
[ 0. -0.5 0.5 0. ]
[ 0. 0. 0.5 1. ]]
Run Code Online (Sandbox Code Playgroud)
返回的结果(a,b,c):
[3.0, 2.0, 2.0]
Run Code Online (Sandbox Code Playgroud)
正确!一切似乎都很好......
数据集2
使用以下"手工制作"点(x,y,z):
(3, 4, 19)
(4, 5, 24)
(5, 6, 29)
Run Code Online (Sandbox Code Playgroud)
对以下矩阵执行LU分解:
[[ 3. 4. 1. 19.]
[ 4. 5. 1. 24.]
[ 5. 6. 1. 29.]]
Run Code Online (Sandbox Code Playgroud)
返回解决U矩阵:
[[ 5.00000000e+00 6.00000000e+00 1.00000000e+00 2.90000000e+01]
[ 0.00000000e+00 4.00000000e-01 4.00000000e-01 1.60000000e+00]
[ 0.00000000e+00 0.00000000e+00 4.44089210e-16 0.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)
返回的结果(a,b,c):
[1.0, 4.0, 0.0]
Run Code Online (Sandbox Code Playgroud)
虽然从技术上讲它是一个解决方案,而不是我想要的!
数据集3
使用以下"手工制作"点(x,y,z):
(5, 6, 29)
(6, 7, 34)
(7, 8, 39)
Run Code Online (Sandbox Code Playgroud)
对以下矩阵执行LU分解:
[[ 5. 6. 1. 29.]
[ 6. 7. 1. 34.]
[ 7. 8. 1. 39.]]
Run Code Online (Sandbox Code Playgroud)
返回解决U矩阵:
[[ 7.00000000e+00 8.00000000e+00 1.00000000e+00 3.90000000e+01]
[ 0.00000000e+00 2.85714286e-01 2.85714286e-01 1.14285714e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.55271368e-15]]
Run Code Online (Sandbox Code Playgroud)
实施崩溃......
思考
在数据集2和3中,最后一行和倒数第二行是"特殊".倒数第二行对"b"和"c"具有相同的值(在我的特殊示例中也是如此!).不幸的是,我缺乏从中得到正面或反面的数学知识.
当最后一行全部为零并且其上方的行具有相等的值时,是否需要处理一些特殊情况?
提前致谢!
是的,这是一个特殊情况,您需要以不同的方式处理.在案例2和3中,您有一个等级缺陷矩阵.通常,它可能意味着存在无限多的解决方案,或者没有解决方案.
您可以通过堆叠这些3向量来检查矩阵的行列式来确定是否会发生这些情况.
>>> import numpy as np
>>> from scipy.linalg import det
>>> data1 = np.array([(2, 2, 12), (3, 4, 19), (4, 5, 24)])
>>> data2 = np.array([(3, 4, 19), (4, 5, 24), (5, 6, 29)])
>>> data3 = np.array([(5, 6, 29), (6, 7, 34), (7, 8, 39)])
>>> det(data1)
-1.9999999999999982
>>> det(data2)
5.551115123125788e-17
>>> det(data3)
8.881784197001213e-16
Run Code Online (Sandbox Code Playgroud)
示例1是一个满秩矩阵,它几何上告诉您3个点是线性无关的.
示例2和3使矩阵具有零行列式,这可以告诉您这些点是线性相关的.
| 归档时间: |
|
| 查看次数: |
5207 次 |
| 最近记录: |