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.

helloworld922
źródło

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)]
xnor
źródło
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!

Frédéric
źródło
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.

algmyr
źródło
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"]
Wartość tuszu
źródło
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"]]
Leaky Nun
źródło
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
Lynn
źródło
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)

R. Kap
źródło