首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求解2x2特征系统

求解2x2特征系统
EN

Code Golf用户
提问于 2015-01-25 12:54:35
回答 3查看 1.5K关注 0票数 15

对于那些有一些线性代数背景的人来说,挑战就像这样简单:确定给定的复2x2矩阵的特征值和特征向量。你可以跳过I/O细节的挑战,对于那些需要对特征系统进行一点复习的人,继续读下去。

背景

矩阵特征方程A定义为

\det| A - λI | = 0

其中λ是一个复(标量)参数,I是恒等矩阵,\det|...|行列式。左侧计算为λ中的多项式,特征多项式在2x2矩阵情况下为二次多项式。这个特征方程的解是A的特征值,我们将其表示为λ_1λ_2

现在,特征向量v_i of A满足

Av_i = λ_iv_i

对于每个λ_i,这给出了一个由两个未知数(v_i的分量)组成的方程组,它可以很容易地求解。你会注意到,系统实际上是欠指定的,特征向量的大小不是由方程决定的。我们通常希望将特征向量归一化,即\sqrt{|x|^2 + |y|^2} = 1,其中xy是向量分量,|x|^2x乘以它的复共轭。

注意,特征值可能是退化的,即λ_1 = λ_2。在这种情况下,你可能可以也可能不能满足单一方程组的两个线性独立的特征向量。

挑战

给定一个具有复元素的2x2矩阵,确定它的两个特征值(可能相同)和每个特征值的归一化特征向量。生成的数字必须精确到至少3(十进制)有效位数。您可以假设任何矩阵元素的实部和虚部都在[-1,1]范围内。

您可以编写函数或程序,通过STDIN、命令行参数、提示符或函数参数接受输入。您可以将结果输出到STDOUT、对话框或函数返回值。

您可以使用任何方便(但不含糊)的字符串或列表格式进行输入和输出。您还可以在浮动对或复杂类型之间进行选择,以表示单个数字。

你不能使用内置函数来求解特征系统(如Mathematica的EigenvectorsEigensystem)或方程求解器。

这是代码高尔夫,所以最短的答案(以字节为单位)获胜。

示例

每个例子是三行:输入,特征值和对应的特征向量的顺序相同。请注意,特征向量只确定到它们的相位,在简并特征值的情况下,特征向量实际上可能是任意的(如第一个例子)。

代码语言:javascript
运行
复制
[[1.0, 0.0], [0.0, 1.0]]
[1.0, 1.0]
[[1.0, 0.0], [0.0, 1.0]]

[[0.0, 0.4], [-0.1, -0.4]]
[-0.2, -0.2]
[[0.894427, -0.447214], [0.894427, -0.447214]]

[[0.3, 0.1], [0.4, -0.9]]
[-0.932456, 0.332456]
[[-0.0808731, 0.996724], [0.951158, 0.308703]]

[[0.5, -1.0], [0.8, -0.5]]
[0.74162i, - 0.74162i]
[[0.745356, 0.372678 - 0.552771i], [0.745356, 0.372678 + 0.552771i]]

[[-0.0539222 + 0.654836i, -0.016102 + 0.221334i], [0.739514 - 0.17735i, -0.0849216 + 0.77977i]]
[0.238781 + 0.984333i, -0.377625 + 0.450273i]
[[0.313668 + 0.322289i, 0.893164], [-0.236405 - 0.442194i, 0.865204]]

[[-0.703107 - 0.331792i, 0.286719 - 0.587305i], [-0.418476 + 0.396347i, -0.885934 + 0.50534i]]
[-1.13654 - 0.32678i, -0.4525 + 0.500329i]
[[0.833367, -0.248208 - 0.493855i], [-0.441133 - 0.408236i, 0.799215]]

[[-0.156312 + 0.788441i, 0.045056 - 0.579167i], [0.130741 - 0.97017i, 0.049183 - 0.590768i]]
[-0.181759 + 1.11738i, 0.0746298 - 0.919707i]
[[0.86955, -0.493846 + 0.000213145i], [0.318856 - 0.0181135i, 0.94763]]
EN

回答 3

Code Golf用户

回答已采纳

发布于 2015-01-25 20:33:11

MATLAB,91

一种获取归一化向量和去除无用自由度的标准技术是将矢量的元素表示为某一角度的余弦和正弦。

我最初尝试用Python编写代码,但是它的数学处理被证明是大脑受损的。它的数学函数拒绝接受复杂的值,它也不明白浮点除以零是可以的。

代码语言:javascript
运行
复制
function[]=f(a,b,c,d)
L=(a+d+[1,-1]*((a-d)^2+4*b*c)^.5)/2
t=atan((L-a)/b);v=[cos(t);sin(t)]

首先,两个特征值被打印在标题L =下。然后在L的相应值下,在v =下打印两个列向量。在有可能这样做的情况下,代码可能无法给出线性独立的向量(这样的程序通常会被认为是被破坏的),但是Martin说它不是必需的。

票数 7
EN

Code Golf用户

发布于 2015-01-25 14:20:15

Python 2,198个字节

代码语言:javascript
运行
复制
a,b,c,d=input()
H=(a+d)/2
D=(H*H-a*d+b*c)**.5
X,Y=H+D,H-D
p,q,r,s=[[1,0,0,1],[b,X-a,b,Y-a],[X-d,c,Y-d,c]][2*(c!=0)or(b!=0)]
A=abs
V=A(A(p)+A(q)*1j)
W=A(A(r)+A(s)*1j)
print[X,Y],[[p/V,q/V],[r/W,s/W]]

输入是通过STDIN列出的4个复数的平坦列表。

代码语言:javascript
运行
复制
[0.0+0j, 0.4+0j, -0.1+0j, -0.4+0j]

注意,Python对复数使用j而不是i

输出是两个列表,第一个列表包含特征值,第二个列表包含特征向量。

代码语言:javascript
运行
复制
[(-0.2+0j), (-0.2+0j)]
[[(0.8944271909999159+0j), (-0.4472135954999579+0j)], [(0.8944271909999159+0j), (-0.4472135954999579+0j)]]

(为清晰起见插入新行)

票数 8
EN

Code Golf用户

发布于 2021-03-09 02:22:58

Dyalog经典,59字节

代码语言:javascript
运行
复制
{a b c d←⍵⋄l,2 1∘.○¯3○b÷⍨a-⍨l←2÷⍨a+d(+,-).5*⍨(4×b×c)+×⍨a-d}

特征值公式的推导:

det|A-\lambda I|=0 \\ det\left|\begin{pmatrix} a & b \\ c & d \end{pmatrix}- \begin{pmatrix} \lambda & 0 \\ 0 & \lambda \end{pmatrix}\right|=0 \\ det\left|\begin{pmatrix} a-\lambda & b \\ c & d-\lambda \end{pmatrix}\right|=0 \\ (a-\lambda)(d-\lambda)-bc=0 \\ \lambda^{2}-(a+d)\lambda+ad-bc=0 \\ \lambda=\frac{a+d\pm \sqrt{(a+d)^{2}-4(ad-bc)}}{2} \\ \lambda=\frac{a+d\pm \sqrt{a^{2}+2ad+d^{2}-4ad+4bc}}{2} \\ \lambda=\frac{a+d\pm \sqrt{a^{2}-2ad+d^{2}+4bc}}{2} \\ \lambda=\frac{a+d\pm \sqrt{(a-d)^{2}+4bc}}{2}

至于特征向量..。我试过的每一件事都比MATLAB的答案长,我还不太明白。可能会在某个时候添加另一种解释。

然后,代码是这些公式的简单实现。

代码语言:javascript
运行
复制
{a b c d←⍵⋄l,2 1∘.○¯3○b÷⍨a-⍨l←2÷⍨a+d(+,-).5*⍨(4×b×c)+×⍨a-d}
 a b c d←⍵                                                    ⍝ assign variable names
                            l←2÷⍨a+d(+,-).5*⍨(4×b×c)+×⍨a-d    ⍝ formula for the eigenvalues
             2 1∘.○¯3○b÷⍨a-⍨l                                 ⍝ formula for the eigenvectors
           l,                                                 ⍝ append eigenvalues             

在网上试试!

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/44926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档