Побудуйте матрицю Якобія


10

Візьміть вектор невідомих введіть тут опис зображенняі застосуйте якусь загальну диференційовану функцію введіть тут опис зображення. Якобіан потім задається матрицею , введіть тут опис зображеннятакі , що:

введіть тут опис зображення

Наприклад, припустимо m=3і n=2. Потім (використовуючи індексацію на основі 0)

введіть тут опис зображення

введіть тут опис зображення

Якобієць fтоді

введіть тут опис зображення

Мета цього завдання - надрукувати цю матрицю Якобії.

Вхідні дані

Ваша програма / функція повинна приймати в якості вхідних два позитивних чисел mі n, які представляють собою ряд компонентів fі uвідповідно. Вхід може надходити з будь-якого потрібного джерела (stdio, параметр функції тощо). Ви можете диктувати порядок їх отримання, і це повинно відповідати будь-якому вкладенню вашої відповіді (будь ласка, вкажіть у своїй відповіді).

Вихідні дані

Щось, що представляє якобіанську матрицю. Це представлення повинне чітко прописати всі елементи матриці Якобії, але точна форма кожного терміна є реалізацією, визначеною до тих пір, поки не буде однозначно те, що диференціюється і щодо чого, і кожен запис виводиться в логічному порядку. Приклад прийнятних форм для представлення матриці:

  1. Список списків, де кожен запис зовнішнього списку відповідає ряду якобійців, а кожен запис внутрішнього списку відповідає стовпцю якобійців.
  2. Рядок або текстовий вихід, де кожен рядок є рядом якобійського, а кожен розділений роздільником роздільник у рядку відповідає стовпцю якобі.
  3. Деякі графічні / візуальні подання матриці. Приклад: що показує Mathematica при використанні MatrixFormкоманди
  4. Деякі інші об'єкти щільної матриці, де кожен запис вже зберігається в пам'яті, і його можна запитати (тобто ви не можете використовувати об'єкт генератора). Прикладом може бути те, як Mathematica внутрішньо представляє об'єкт Matrix

Приклади форматів запису:

  1. Рядок форми d f_i/d u_j, де iі jє цілі числа. Приклад: d f_1/d u_2. Зауважте, що ці проміжки між dта f_1або x_2є необов'язковими. Крім того, підкреслення також необов’язково.
  2. Рядок форми d f_i(u_1,...,u_n)/d u_jабо d f_i(u)/d u_j. Тобто вхідні параметри функціонального компонента f_iнеобов’язкові і можуть бути чітко прописані або залишені у компактному вигляді.
  3. Відформатований графічний вихід. Наприклад: що друкує Mathematica, коли ви оцінюєте виразD[f_1[u_,u_2,...,u_n],u_1]

Ви можете вибрати те , що вихідний індекс uі fє (будь ласка , вкажіть у відповіді). Вихід може бути до будь-якої бажаної раковини (stdio, значення повернення, вихідний параметр тощо).

Тестові справи

У наступних тестових випадках використовується конвенція m,n. Показники показані на основі 0.

1,1
[[d f0/d u0]]

2,1
[[d f0/d u0],
 [d f1/d u0]]

2 2
[[d f0/d u0, d f0/d u1],
 [d f1/d u0, d f1/d u1]]

1,2
[[d f0/d u0, d f0/d u1]]

3,3
[[d f0/d u0, d f0/d u1, d f0/d u2],
 [d f1/d u0, d f1/d u1, d f1/d u2],
 [d f2/d u0, d f2/d u1, d f2/d u2]]

Оцінка балів

Це код гольфу; найкоротший код у байтах виграє. Стандартні лазівки заборонені. Вам дозволяється використовувати будь-які вбудовані модулі.

Відповіді:


4

Пітон, 63 байти

lambda m,n:["df%d/du%%d "%i*n%tuple(range(n))for i in range(m)]

Для m=3,n=2виходів

['df0/du0 df0/du1 ', 'df1/du0 df1/du1 ', 'df2/du0 df2/du1 ']

Форматування рядків на 1 байт коротше, ніж більш очевидне

lambda m,n:[["df%d/du"%i+`j`for j in range(n)]for i in range(m)]

3

R, 93 78 байт

function(M,N){v=vector();for(i in 1:N){v=cbind(v,paste0("df",1:M,"/du",i))};v}

Нумерація на основі 1.

-15 байт завдяки @AlexA. рімейки!


1
Ви можете зберегти кілька байт, видаливши ім’я функції, тобто f=, як це звичайна практика тут. R також повертає останнє, що оцінюється у функції, так що ви можете просто використовувати vзамість return(v).
Олексій А.

1
Ви також повинні мати можливість зберігати байти шляхом індексації від 1 замість 0, що дозволено ОП.
Алекс А.

@AlexA. Дуже цікаві зауваження, велике спасибі!
Фредерік

Моє задоволення. :)
Алекс А.

3

Максима, 68 байт

Дуже погано, що я не знаю Максима, як я знаю своїх дорогих C і Matlab. Але я все ж спробую.

f(m,n):=(x:makelist(x[i],i,m),g:makelist(g[i](x),i,n),jacobian(g,x))

Приклад сеансу з використанням TeXmacs як інтерпретатора Maxima, здебільшого для акуратного відображення математики:

Сесія Maxima в TeXmacs

Можливо, є кращі способи складання списків і подібних у Maxima (я б особливо хотів, щоб функції з'являлися без маркерів списку, []), але я не знаю мови досить добре.


1

Рубін, 53 байти

fє 0-індексованим, uє 1-індексованим. Спробуйте в Інтернеті!

->m,n{m.times{|i|p (1..n).map{|j|"d f#{i}/d u#{j}"}}}

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

["d f0/d u1", "d f0/d u2", "d f0/d u3"]
["d f1/d u1", "d f1/d u2", "d f1/d u3"]


0

Желе, 18 байт

ps⁴’“ df“/du”ż$€€G

Спробуй!

Дано (m, n) = (3, 2) , відбитки (з пробілами, позначеними як ·:)

·df0/du0·df0/du1
·df1/du0·df1/du1
·df2/du0·df2/du1

0

C, 125 байт:

main(w,y,b,q){scanf("%d %d",&w,&y);for(b=0;b<w;b++){for(q=0;q<y;q++)printf("d f%d/du u%d%s",b,q,q<y-1?", ":"");printf("\n");}}

Приймає введення як два цілих цілих числа, b yі виводить матрицю Якобіана як yрядки, розділені комами на bрядках.

C It Online! (Ideone) або Test Suite (Ideone)

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