Чи є матриця позитивно-визначеною?


19

Вступ

Сьогодні ми піклуємось про групу студентів першокурсників лінійної алгебри: визначеність матриці! Мабуть, це ще не є проблемою, і ось ми:

Вхідні дані

  • А симетрична матриця в будь-якому зручному форматі (ви можете також, звичайно , тільки взяти верхню чи нижню частину матриці)n×n AA
  • За бажанням: розмір матриціn

Що робити?

Завдання проста: Дана матриця, реально оцінена Матриця вирішує, чи є вона позитивно визначеною, вивівши значення truthy, якщо так, і значення фальси, якщо ні.n×n

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

Хто виграє?

Це , тому найкоротший код у байтах (за мовою) виграє!


Що таке матриця, що визначається позитивом?

Мабуть, існує 6 еквівалентних рецептур, коли симетрична матриця є позитивно визначеною. Я відтворять три простіші та посилаю вас у Вікіпедію на більш складні.

  • Якщо тоді є позитивно-визначеним. Це можна переформулювати так: Якщо для кожного ненульового вектора (стандартний) крапковий добуток і позитивний, то є позитивним-певним.vRn{0}:vTAv>0A

    vvAvA
  • Нехай бути власні з , якщо зараз (тобто всі власні значення позитивні), тоді є позитивним-певним. Якщо ви не знаєте, що таке власні значення, я пропоную вам скористатись улюбленою пошуковою системою, тому що пояснення (та необхідні стратегії обчислення) занадто довго містяться в цій публікації.λii{1,,n}A i { 1 , , n } : λ i > 0 AAi{1,,n}:λi>0A
  • Якщо Холецького-розкладання з існує, то існує нижній-трикутна матриця такого , що , то позитивно визначено. Зауважте, що це еквівалентно ранньому поверненню "false", якщо в будь-який момент обчислення кореня під час роботи алгоритму виходить з ладу через негативний аргумент.ALLLT=AA

Приклади

Для надійного виходу

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Для виходу фальси

(принаймні одне власне значення 0 / позитивне напіввизначене)

(322240202)

(Власні значення мають різні знаки / невизначено)

(100010001)

(усі власні значення менші ніж 0 / від'ємне певне)

(100010001)

(усі власні значення менші ніж 0 / від'ємне певне)

(230350001)

(усі власні значення менші ніж 0 / від'ємне визначене)

(7.152.452.459.37)

(три позитивні, одне негативне власне значення / невизначене)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



Вам потрібно дати краще визначення того, що ми повинні шукати, а не припускати, що ми всі можемо читати математичні позначення (або всі знаємо, що таке "власне значення"). Корисний і відпрацьований приклад.
Кудлатий

9
@Shaggy Я думаю, що виклик краще, не маючи заднього фону. Існує багато пояснень того, що власне значення є деінде, і ця посада вже справді велика.
Пшеничний майстер

1
Завдання було б приємніше, якби ви не обмежили введення симетричними матрицями.
polfosol ఠ_ఠ

1
Я мав на увазі, просто перевірити наявність власних значень також нудно. Я знаю різні смаки;)
polfosol ఠ_ఠ

Відповіді:


11

C, 108 байт

-1 байт завдяки Логерну
-3 байти завдяки слюсарі

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

Спробуйте в Інтернеті!

Виконує Гауссова елімінацію та перевіряє, чи всі діагональні елементи позитивні (критерій Сільвестра). Аргумент n- розмір матриці мінус одна.


Можливо, збережіть персонажа з поплавком замість подвійного?
Єнс


Ви можете поголити інший символ, якщо ви потрапите i=0в цикл for, зробіть рекурсивний виклик f(M,n-1,0)та початковий виклик з 0 як третій аргумент.
Єнс

@Jens 1. Використання плавців замість подвійних може швидко призвести до помітних помилок округлення, тому я не думаю, що збережений один байт не вартий цього. 2. Ініціалізація змінної за допомогою додаткового аргументу мені схожа на обман.
nwellnhof

@Logern Я відмовляюся використовувати трюк "опустити заяву повернення" у своїх відповідях на "С". Але спасибі за інший збережений байт.
nwellnhof

9

MATLAB / Октава , 19 17 12 байт

@(A)eig(A)>0

Спробуйте в Інтернеті!

Функція eig забезпечує власні значення у порядку зростання, тому, якщо перша власна величина більша за нуль, інші теж.


Ви можете залишити f=на початку - анонімні функції загальноприйняті як відповіді.
Delfad0r

Дякую за пораду!
Даніель Турізо

Навіть якщо його вектор? Цікаво
Даніель Турізо

1
+1. Я додав посилання для спробу в Інтернеті. Сподіваюся, ви не заперечуєте. Зауважте, що це також доводить, що вихідні значення, не дивлячись на масиви, вважаються правильними значеннями "truthy" або "falsey" за посиланням @ Delfad0r.
Том Карпентер

2
Сказавши це, він не вдається для першого тестового випадку "фальси" на TIO. Я здогадуюсь через проблему точності - одне зі значень Ейґена виходить 8.9219e-17замість 0.
Том Карпентер

7

Желе , 11 10 байт

ṖṖ€$ƬÆḊṂ>0

Використовує критерій Сильвестра .

Спробуйте в Інтернеті!

Як це працює

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell , 56 байт

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

Спробуйте в Інтернеті!

В основному відповідь на відповідь nwellnhof . Виконує гауссова елімінація та перевіряє, чи позитивні елементи на головній діагоналі.

Виходить з ладу перший фальсифікат через помилки округлення, але теоретично він би працював з нескінченною точністю. Завдяки пропозиції Кертіса Бехтеля , тепер усі результати правильні.


2
ви можете додати, inputs :: [[[Rational]]]щоб отримати правильні відповіді
Кертіс Бехтел,

4

Чи повинен 4-й тестовий випадок бути помилковим?
tsh

@tsh Виправлено, я німий!
Містер Xcoder

8
Смішно, як Mathematica має для цього вбудований , але його назва довша, ніж ваше рішення.
Федеріко Полоні

@FedericoPoloni: Невже рішення за допомогою NullSpace чи MatrixRank не буде ще коротшим? Якщо нульовий простір дорівнює нулю, то матриця визначена позитивно.
Phil H

@PhilH Ні, боюся, це не спрацює саме по собі. Наприклад, другий приклад фальси (діагональна матриця з (1, -1,1)) має ранг 3, але не є позитивно визначеним.
Федеріко Полоні

3

MATL , 4 байти

Yv0>

Спробуйте в Інтернеті!

[3 -2 2; -2 4 0; 2 0 2]01018


1
@LuisMendo Дякую, сьогодні я дізнався щось нове про MATL!
Містер Xcoder

Моє задоволення :-) Ось краще пояснення від Сьювера. Я забув сказати, що для масивів зі складними значеннями лише реальна частина порівнюється проти нуля. Так [1 2 3j]само і фальси
Луїс Мендо



2

MATL , 6 байт

Це можна зробити, використовуючи ще менше байтів, @Mr. Xcoder зумів знайти 5-байтну відповідь MATL !

YvX<0>

Пояснення

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

Спробуйте в Інтернеті!


Не вдалося отримати перший тестовий випадок. Дивіться мою видалену відповідь .
Містер Xcoder

1
@ Mr.Xcoder О, ви навіть подали відповідь до мене. Я думаю, вам слід скасувати відповідь, оскільки це просто залежить від питань округлення. (Я думаю, що ви можете очікувати відповідей на використання арифметики з обмеженою точністю. Я думаю, що тут використовуються точні обчислення лише мовами CAS.)
flawr

Слідуючи вашим порадам, я це визнав .
Містер Xcoder

1

Клен , 33 байти

(тобто мої 2 копійки)

with(LinearAlgebra):
IsDefinite(A)

Привіт і ласкаво просимо до PPCG; Я не знайомий з Кленом, хоча необхідний новий рядок?
Джонатан Фрех

@JonathanFrech Привіт і спасибі Ні це не так. Я не рахував це до речі.
polfosol ఠ_ఠ

Мені здається, що ваша кількість байтів відображає символ нового рядка.
Джонатан Фрех

@JonathanFrech Дух, мій поганий
polfosol ఠ_ఠ

1
Ну ... тепер ваш код і ваш байт не погоджуються.
Джонатан Фрех

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