- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
目标
给定一组点,我试图找出满足所提供所有点的线性方程的系数。
例如,如果我想求线性方程 (ax + by + c = z):
3x + 2y + 2 = z
我至少需要三个三维点:
(2, 2, 12)
(3, 4, 19)
(4, 5, 24)
给定足够多的坐标点 (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)
对以下矩阵执行 LU 分解:
[[ 2. 2. 1. 12.]
[ 3. 4. 1. 19.]
[ 4. 5. 1. 24.]]
回解U矩阵:
[[ 4. 5. 1. 24. ]
[ 0. -0.5 0.5 0. ]
[ 0. 0. 0.5 1. ]]
返回结果(a,b,c):
[3.0, 2.0, 2.0]
正确!一切似乎都很好......
数据集 2
使用以下“手工制作”点 (x, y, z):
(3, 4, 19)
(4, 5, 24)
(5, 6, 29)
对以下矩阵执行 LU 分解:
[[ 3. 4. 1. 19.]
[ 4. 5. 1. 24.]
[ 5. 6. 1. 29.]]
回解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]]
返回结果(a,b,c):
[1.0, 4.0, 0.0]
虽然从技术上讲这是一个解决方案,但不是我想要的!
数据集 3
使用以下“手工制作”点 (x, y, z):
(5, 6, 29)
(6, 7, 34)
(7, 8, 39)
对以下矩阵执行 LU 分解:
[[ 5. 6. 1. 29.]
[ 6. 7. 1. 34.]
[ 7. 8. 1. 39.]]
回解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]]
执行崩溃...
想法
在数据集 2 和 3 中,最后一行和倒数第二行是“特殊的”。倒数第二行的“b”和“c”具有相同的值(在我的特殊示例中也是如此!)。不幸的是,我缺乏从中得出正面或反面的数学知识。
当最后一行全为零且其上方的行具有相等的值时,是否有我需要处理的特殊情况?
提前致谢!
最佳答案
是的,这是一种特殊情况,您需要以不同方式处理。在情况 2 和 3 中你有一个 rank deficient matrix .通常它可能意味着有无穷多个解,或者没有解。
您可以通过检查 determinant 来确定这些情况是否会发生您通过堆叠这些 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
示例 1 是一个满秩矩阵,它在几何上告诉您 3 个点是 linearly independent .
示例 2 和 3 生成行列式为零的矩阵,这告诉您这些点是线性相关的。
关于Python 线性方程 - 高斯消元法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847853/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!