解决2x2特征系统


11

对于那些具有线性代数背景的人来说,挑战就这么简单:确定给定复数2x2矩阵的特征值和特征向量。您可能会跳过I / O详细信息等的挑战。对于那些需要对本征系统进行一些复习的人,请继续阅读。

背景

矩阵A特征方程定义为

det| A - λI | = 0

其中λ是复数(标量)参数,I是单位矩阵,det | ... | 决定因素。左侧求值为λ多项式,即特征多项式,在2x2矩阵的情况下,该多项式是二次的。这个特征方程的解决方案是特征值,我们将表示为λ 1λ 2

现在,特征向量 v 一个满足

A vi = λi vi

对于每一个λ ,这给你两个方程的两个未知数的系统(的成分v ),它可以很容易地解决。您会注意到系统实际上是未指定的,特征向量的大小不是由等式确定的。通常,我们将希望对特征向量进行归一化,即√(| x | 2 + | y | 2)= 1,其中xy是向量分量,| x |。2X乘以其复共轭。

注意,特征值可以是简并的,即,λ 12。在这种情况下,您可能无法满足具有两个线性独立特征向量的单一方程组。

挑战

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

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

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

您不得使用内置函数来求解本征系统(如Mathematica EigenvectorsEigensystem)或方程式求解器。

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

例子

每个示例都是三行:输入,特征值和对应的特征向量(按相同顺序)。注意,特征向量仅在其相位之前确定,并且在简并的特征值的情况下,特征向量实际上可以是任意的(如在第一示例中)。

[[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]]

Answers:


6

MATLAB,91

获得归一化向量并消除无用的自由度的标准技术是将向量的元素表示为某个角度的余弦和正弦。

我最初尝试使用Python进行编码,但是事实证明,它的数学处理方式会严重损坏大脑。它的数学函数拒绝接受复杂的值,并且不了解浮点数被零除是可以的。

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表示并非必需。


8

Python 2,198字节

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个复数的平面列表,例如

[0.0+0j, 0.4+0j, -0.1+0j, -0.4+0j]

请注意,Python使用j而不是i用于复数。

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

[(-0.2+0j), (-0.2+0j)]
[[(0.8944271909999159+0j), (-0.4472135954999579+0j)], [(0.8944271909999159+0j), (-0.4472135954999579+0j)]]

(为清楚起见插入了换行符)


3

Lua中,462个 455 431 427字节

Lua中没有内置的复杂数学。也没有向量运算。所有这些都必须手动滚动。

a,b,c,d,e,f,g,h=...x=math.sqrt z=print i=a-g j=b-h
k=(i^2-j^2)/2+2*(c*e-d*f)m=x(k^2+(i*j+2*(c*f+d*e))^2)n=x(m+k)o=x(m-k)i=(a+g+n)/2
j=(b+h+o)/2 k=(a+g-n)/2 l=(b+h-o)/2 z(i,j,k,l)q=c^2+d^2 r=e^2+f^2 s=q+r if s==0
then z(1,0,0,0,0,0,1,0)else if r==0 then m,n,o,p=c,d,c,d c,d=i-a,j-b e,f=k-a,l-b
u=x(q+c^2+d^2)v=x(q+e^2+f^2)else m,n=i-g,j-h o,p=k-g,l-h c,d=e,f
u=x(r+m^2+n^2)v=x(r+o^2+p^2)end z(m/u,n/u,o/v,p/v,c/u,d/u,e/v,f/v)end

使用以下参数从命令行运行:

lua eigen.lua Re(a) Im(a) Re(b) Im(b) Re(c) Im(c) Re(d) Im(d)

产生以下输出:

Re(lambda1) Im(lambda1) Re(lambda2) Im(lambda2)
Re(v11) Im(v11) Re(v12) Im(v12) Re(v21) Im(v21) Re(v22) Im(v22)

...对于a,b,c,d输入矩阵的4个分量,lambda1和lambda2是两个特征值,v11,v21是第一个单位特征向量,而v12,v22是第二个单位特征向量。例如,

lua eigen.lua 1 0  1 0  1 0  0 0

...产生...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.