Построить матрицу Якоби

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. Индексы показаны с нуля.

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

счет

Это код гольф; выигрывает самый короткий код в байтах. Стандартные лазейки запрещены. Вам разрешено использовать любые встроенные модули по вашему желанию.

helloworld922
источник

Ответы:

4

Python, 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)]
XNOR
источник
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, что разрешено OP.
Алекс А.
@AlexA. Очень интересные замечания, большое спасибо!
Фредерик
С удовольствием. :)
Алекс А.
3

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

Жаль, что я не знаю Максиму так, как знаю своих дорогих Си и Матлаба. Но я все же попробую.

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

Пример сеанса с использованием TeXmacs в качестве интерпретатора Maxima, в основном для аккуратной математической отрисовки:

Максима сессия в TeXmacs

Вполне возможно, что в Maxima есть лучшие способы создания списков и тому подобное (я бы особенно хотел, чтобы функции появлялись без маркеров списка, []), но я недостаточно хорошо знаю язык.

algmyr
источник
1

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

f0 индексируется, u1 индексируется. Попробуйте онлайн!

->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"]
Значение чернил
источник
1

Чеддер , 79 49 байтов

m->n->(|>m).map(i->(|>n).map(j->"df%d/du%d"%i%j))

Видимо вилка этого ответа .

Для 3,2возврата:

[["df0/du0", "df0/du1", "df0/du2"], ["df1/du0", "df1/du1", "df1/du2"]]
Дрянная Монахиня
источник
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");}}

Принимает ввод как 2 целых числа, разделенных пробелами, b yи выводит матрицу Якоби в виде yстрок через запятую b.

С онлайн! (Ideone) или тестовый набор (Ideone)

Р. Кап
источник