Konstruieren Sie die Jacobi-Matrix


10

Nehmen Sie den Vektor der Unbekannten Geben Sie hier die Bildbeschreibung einund wenden Sie eine generische differenzierbare Funktion an Geben Sie hier die Bildbeschreibung ein. Der Jacobianer wird dann durch eine Matrix gegeben, Geben Sie hier die Bildbeschreibung einso dass:

Geben Sie hier die Bildbeschreibung ein

Nehmen wir zum Beispiel an m=3und n=2. Dann (mit 0-basierter Indizierung)

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Der Jakobianer von fist dann

Geben Sie hier die Bildbeschreibung ein

Das Ziel dieser Herausforderung ist es, diese Jacobi-Matrix zu drucken.

Eingang

Ihr Programm / Funktion sollte nehmen als Eingabe zwei positive ganze Zahlen sind mund n, die die Anzahl der Komponenten darstellen fund ujeweils. Die Eingabe kann von jeder gewünschten Quelle stammen (stdio, Funktionsparameter usw.). Sie können die Reihenfolge bestimmen, in der diese empfangen werden. Dies muss für jede Eingabe in Ihre Antwort konsistent sein (bitte in Ihrer Antwort angeben).

Ausgabe

Etwas, das die jakobianische Matrix darstellt. Diese Darstellung muss explizit alle Elemente der Jacobi-Matrix buchstabieren, aber die genaue Form jedes Begriffs ist eine Implementierung, die definiert ist, solange eindeutig ist, was und in Bezug auf was unterschieden wird, und jeder Eintrag in einer logischen Reihenfolge ausgegeben wird. Beispiel akzeptable Formen zur Darstellung einer Matrix:

  1. Eine Liste von Listen, wobei jeder Eintrag der äußeren Liste einer Zeile des Jacobian entspricht und jeder Eintrag der inneren Liste einer Spalte des Jacobian entspricht.
  2. Eine Zeichenfolge oder Textausgabe, bei der jede Zeile eine Zeile des Jacobian ist und jeder durch Trennzeichen getrennte Eintrag in einer Zeile einer Spalte des Jacobian entspricht.
  3. Einige grafische / visuelle Darstellung einer Matrix. Beispiel: Was wird von Mathematica bei Verwendung des MatrixFormBefehls angezeigt ?
  4. Ein anderes dichtes Matrixobjekt, bei dem jeder Eintrag bereits im Speicher gespeichert ist und abgefragt werden kann (dh Sie können kein Generatorobjekt verwenden). Ein Beispiel wäre, wie Mathematica intern ein Matrix-Objekt darstellt

Beispiel für Eingabeformate:

  1. Eine Zeichenfolge des Formulars d f_i/d u_j, wobei iund jGanzzahlen sind. Bsp. : d f_1/d u_2. Beachten Sie, dass diese Leerzeichen zwischen dund f_1oder x_2optional sind. Zusätzlich sind die Unterstriche optional.
  2. Eine Zeichenfolge der Form d f_i(u_1,...,u_n)/d u_joder d f_i(u)/d u_j. Das heißt, die Eingabeparameter der Funktionskomponente f_isind optional und können entweder explizit geschrieben oder in kompakter Form belassen werden.
  3. Eine formatierte grafische Ausgabe. Beispiel: Was Mathematica druckt, wenn Sie den Ausdruck auswertenD[f_1[u_,u_2,...,u_n],u_1]

Sie können den Startindex auswählen uund fangeben (bitte in Ihrer Antwort angeben). Die Ausgabe kann an eine beliebige Senke erfolgen (Standard, Rückgabewert, Ausgabeparameter usw.).

Testfälle

Die folgenden Testfälle verwenden die Konvention m,n. Indizes werden 0-basiert angezeigt.

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

Wertung

Das ist Code Golf; Der kürzeste Code in Bytes gewinnt. Standardlücken sind verboten. Sie dürfen alle gewünschten Einbauten verwenden.

Antworten:


4

Python, 63 Bytes

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

Für m=3,n=2Ausgänge

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

Die Zeichenfolgenformatierung ist 1 Byte kürzer als die offensichtlichere

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

3

R 93 78 Bytes

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

Die Nummerierung basiert auf 1.

-15 Bytes dank @AlexA. remaks!


1
Sie können einige Bytes sparen, indem Sie den Funktionsnamen entfernen f=, wie dies hier üblich ist. R gibt auch das letzte in einer Funktion ausgewertete Element zurück, sodass Sie es vstattdessen anstelle von verwenden können return(v).
Alex A.

1
Sie sollten auch in der Lage sein, Bytes zu speichern, indem Sie von 1 anstelle von 0 indizieren, was vom OP zugelassen wird.
Alex A.

@AlexA. Sehr interessante Bemerkungen, vielen Dank!
Frédéric

Gern geschehen. :)
Alex A.

3

Maxima, 68 Bytes

Es ist schade, dass ich Maxima nicht so kenne wie mein liebes C und Matlab. Aber ich werde es trotzdem versuchen.

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

Beispielsitzung mit TeXmacs als Maxima-Interpreter, hauptsächlich für ordentliches mathematisches Rendern:

Maxima-Sitzung in TeXmacs

Es mag in Maxima durchaus bessere Möglichkeiten geben, Listen und dergleichen zu erstellen (ich möchte insbesondere, dass die Funktionen ohne die Listenmarkierungen angezeigt werden, []), aber ich kenne die Sprache nicht gut genug.


1

Ruby, 53 Bytes

fist 0-indiziert, uist 1-indiziert. Probieren Sie es online aus!

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

Jede Zeile belegt eine Zeile als Array-Darstellung (siehe unten). Wenn es nicht den Spezifikationen entspricht, lassen Sie es mich bitte wissen und ich werde es beheben.

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

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

Anscheinend eine Gabelung dieser Antwort .

Für 3,2Rücksendungen:

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

0

Gelee, 18 Bytes

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

Versuch es!

Bei (m, n) = (3, 2) wird gedruckt (mit Leerzeichen markiert als ·:)

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

0

C, 125 Bytes:

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

Nimmt die Eingabe als 2 durch Leerzeichen getrennte Ganzzahlen b yund gibt die Jacobi-Matrix als durch yKommas getrennte Zeichenfolgen in bZeilen aus.

C Es online! (Ideone) oder Testsuite (Ideone)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.