Розв’яжіть систему 2x2 Eigens


11

Для тих, хто має трохи лінійну алгебру, проблема є такою ж простою: визначити власні значення та власні вектори заданої складної матриці 2x2. Ви можете пропустити заздалегідь деталі Challenge для вводу / виводу тощо. Для тих, кому потрібно трохи оновити власні системи, читайте далі.

Фон

Характеристичне рівняння матричного А визначається

det| A - λI | = 0

де λ - складний (скалярний) параметр, I - матриця ідентичності та det | ... | є визначальним . Ліва сторона оцінює на многочлен у λ - характерний многочлен , який є квадратичним у випадку матриць 2x2. Рішення цього характеристичного рівняння на власні значення з А , який ми будемо позначати λ 1 і λ 2 .

Тепер власні вектори v I з A задовольняють умові

A vi = λi vi

Для кожного λ i це дає вам систему з двох рівнянь у двох невідомих (компоненти v i ), які можна вирішити досить легко. Ви помітите, що система насправді не визначена, а величина власних векторів не визначається рівняннями. Зазвичай ми хочемо нормалізувати власні вектори, тобто √ (| x | 2 + | y ​​| 2 ) = 1 , де x і y - векторні компоненти, | x | 2 є х , помножені на комплексно поєднане.

Зауважте, що власні значення можуть бути виродженими, тобто λ 1 = λ 2 . У цьому випадку ви можете або не зможете задовольнити єдину систему рівнянь з двома лінійно незалежними власними векторами.

Змагання

Давши матрицю 2x2 зі складними елементами, визначте її дві (можливо однакові) власні значення та нормоване власне вектори для кожного власного значення. Отримані цифри повинні бути точними щонайменше до 3 (десяткових) значущих цифр. Можна припустити, що реальна і уявна частини будь-якого елемента матриці знаходиться в діапазоні [-1,1] .

Ви можете написати функцію або програму, взявши введення через STDIN, аргумент командного рядка, підказку або аргумент функції. Ви можете вивести результат у STDOUT, діалоговому вікні або як повернене значення функції.

Ви можете використовувати будь-який зручний (але однозначний) формат рядка або списку для введення та виводу. Ви також можете вибрати між парами поплавців або складними типами для представлення окремих чисел.

Ви не повинні використовувати вбудовані функції для вирішення власних систем (наприклад, математики Eigenvectorsабо Eigensystem) або розв'язувачів рівнянь.

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.

Приклади

Кожен приклад - це три рядки: вхідні, власні значення та відповідні власні вектори в одному порядку. Зауважимо, що власні вектори визначаються лише до їх фази, і що у випадку вироджених власних значень власні вектори можуть бути насправді довільними (як у першому прикладі).

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

Відповіді:


6

МАТЛАБ, 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 =. Код може не дати лінійно незалежних векторів у випадках, коли це можливо зробити (така програма, як правило, вважається порушеною), але Мартін сказав, що це не потрібно.


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

Введення - це плоский список із 4 складних чисел через STDIN, наприклад

[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

Луа, 462 455 431 427 байт

У Луї немає вбудованої складної математики. Жодних векторних операцій також. Все треба було катати вручну.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.