Zbuduj matrycę jakobską


10

Weź wektor niewiadomych wprowadź opis zdjęcia tutaji zastosuj ogólną funkcję różnicowalną wprowadź opis zdjęcia tutaj. Jakobian jest następnie podawany przez matrycę wprowadź opis zdjęcia tutajtak że:

wprowadź opis zdjęcia tutaj

Załóżmy na przykład m=3i n=2. Następnie (przy użyciu indeksowania opartego na 0)

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jakobian fjest wtedy

wprowadź opis zdjęcia tutaj

Celem tego wyzwania jest wydrukowanie tej jakobińskiej matrycy.

Wejście

Twój program / funkcja powinna przyjąć jako dane wejściowe dwie dodatnie liczby całkowite mi n, które reprezentują odpowiednio liczbę składników fi u. Dane wejściowe mogą pochodzić z dowolnego żądanego źródła (standard, parametr funkcji itp.). Możesz dyktować kolejność ich otrzymywania i musi to być spójne w przypadku wszelkich danych wejściowych do Twojej odpowiedzi (proszę podać w odpowiedzi).

Wynik

Coś, co reprezentuje matrycę jakobską. Reprezentacja ta musi wyraźnie określać wszystkie elementy macierzy jakobskiej, ale dokładna forma każdego terminu jest definiowana implementacyjnie, o ile jednoznaczne jest to, co się wyróżnia i co do tego, a każda pozycja jest wyprowadzana w logicznej kolejności. Przykładowe dopuszczalne formy reprezentowania macierzy:

  1. Lista list, w których każdy wpis na liście zewnętrznej odpowiada rzędowi jakobianu, a każdy wpis na liście wewnętrznej odpowiada kolumnie jakobianu.
  2. Ciąg lub wynik tekstowy, w którym każda linia jest rzędem jakobianu, a każdy separator oddzielony znakiem w linii odpowiada kolumnie jakobianu.
  3. Niektóre graficzne / wizualne przedstawienie matrycy. Przykład: co pokazuje Mathematica podczas używania MatrixFormpolecenia
  4. Jakiś inny gęsty obiekt macierzy, w którym każdy wpis jest już zapisany w pamięci i można go zapytać (tzn. Nie można użyć obiektu generatora). Przykładem może być to, jak Mathematica wewnętrznie reprezentuje obiekt Matrix

Przykładowe formaty wpisów:

  1. Ciąg formy d f_i/d u_j, gdzie ii jsą liczbami całkowitymi. Np d f_1/d u_2. : Zauważ, że te przestrzenie pomiędzy di f_1czy x_2są opcjonalne. Dodatkowo podkreślenia są również opcjonalne.
  2. Ciąg formularza d f_i(u_1,...,u_n)/d u_jlub d f_i(u)/d u_j. Oznacza to, że parametry wejściowe komponentu funkcji f_isą opcjonalne i mogą być albo wyraźnie określone, albo pozostawione w zwartej formie.
  3. Sformatowane wyjście graficzne. Np .: co drukuje Mathematica podczas oceny wyrażeniaD[f_1[u_,u_2,...,u_n],u_1]

Możesz wybrać indeks początkowy ui fto (proszę podać w odpowiedzi). Wyjście może być do dowolnego pożądanego ujścia (standard, wartość zwracana, parametr wyjściowy itp.).

Przypadki testowe

Następujące przypadki testowe wykorzystują konwencję m,n. Indeksy są wyświetlane w oparciu o 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]]

Punktacja

To jest kod golfowy; najkrótszy kod w bajtach wygrywa. Standardowe luki są zabronione. Możesz używać dowolnych wbudowanych elementów.

Odpowiedzi:


4

Python, 63 bajty

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

Do m=3,n=2wyjść

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

Formatowanie ciągu znaków jest o 1 bajt krótsze niż bardziej oczywiste

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

3

R, 93 78 bajtów

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

Numeracja jest oparta na 1.

-15 bajtów dzięki @AlexA. remaks!


1
Możesz zaoszczędzić kilka bajtów, usuwając nazwę funkcji, tj. f=Jak to jest tutaj powszechną praktyką. R zwraca także ostatnią rzecz ocenianą w funkcji, więc możesz po prostu użyć vzamiast return(v).
Alex A.

1
Powinieneś także móc zapisywać bajty, indeksując od 1 zamiast 0, co jest dozwolone przez OP.
Alex A.

@AlexA. Bardzo ciekawe uwagi, wielkie dzięki!
Frédéric,

Cała przyjemność po mojej stronie. :)
Alex A.,

3

Maxima, 68 bajtów

Szkoda, że ​​nie znam Maximy, tak jak znam mojego drogiego C i Matlaba. Ale spróbuję mimo wszystko.

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

Przykładowa sesja z wykorzystaniem TeXmacsa jako interpretera Maxima, głównie do schludnego renderowania matematycznego:

Sesja Maxima w TeXmacs

Mogą istnieć lepsze sposoby tworzenia list itp. W Maxima (szczególnie chciałbym, aby funkcje pojawiały się bez znaczników list, []), ale nie znam wystarczająco dobrze języka.


1

Rubin, 53 bajty

fma indeks 0, ujest indeksowany 1. Wypróbuj online!

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

Każdy wiersz zajmuje jedną linię jako reprezentację tablicy, jak pokazano poniżej. Jeśli nie jest zgodny ze specyfikacją, daj mi znać, a ja to naprawię.

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

Cheddar , 79 49 bajtów

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

Najwyraźniej rozwidlenie tej odpowiedzi .

Do 3,2zwrotów:

[["df0/du0", "df0/du1", "df0/du2"], ["df1/du0", "df1/du1", "df1/du2"]]

0

Galaretka, 18 bajtów

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

Wypróbuj to!

Biorąc pod uwagę (m, n) = (3, 2) , odbitki (ze spacjami oznaczonymi jako ·:)

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

0

C, 125 bajtów:

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");}}

Pobiera dane wejściowe jako 2 liczby całkowite oddzielone spacjami b yi wysyła macierz Jakobian jako yciągi rozdzielone przecinkami w bwierszach.

C It Online! (Ideone) lub Test Suite (Ideone)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.