Construir la matriz jacobiana


10

Tome el vector de incógnitas ingrese la descripción de la imagen aquíy aplique alguna función genérica diferenciable ingrese la descripción de la imagen aquí. El jacobiano está dado por una matriz ingrese la descripción de la imagen aquítal que:

ingrese la descripción de la imagen aquí

Por ejemplo, supongamos que m=3y n=2. Luego (usando indexación basada en 0)

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

El jacobiano de fes entonces

ingrese la descripción de la imagen aquí

El objetivo de este desafío es imprimir esta matriz jacobiana.

Entrada

Su programa / función debe tomar como entrada dos enteros positivos my n, que representan el número de componentes de fy urespectivamente. La entrada puede provenir de cualquier fuente deseada (stdio, parámetro de función, etc.). Puede dictar el orden en que se reciben, y esto debe ser coherente para cualquier entrada a su respuesta (especifique en su respuesta).

Salida

Algo que representa la matriz jacobiana. Esta representación debe explicar explícitamente todos los elementos de la matriz jacobiana, pero la forma exacta de cada término es la implementación definida siempre que no sea ambigua lo que se diferencia y con respecto a qué, y cada entrada se emite en un orden lógico. Ejemplos de formas aceptables para representar una matriz:

  1. Una lista de listas donde cada entrada de la lista externa corresponde a una fila del jacobiano, y cada entrada de la lista interna corresponde a una columna del jacobiano.
  2. Una cadena o salida textual donde cada línea es una fila del jacobiano, y cada entrada separada por delimitador en una línea corresponde a una columna del jacobiano.
  3. Alguna representación gráfica / visual de una matriz. Ejemplo: lo que muestra Mathematica cuando usa el MatrixFormcomando
  4. Algún otro objeto de matriz denso donde cada entrada ya está almacenada en la memoria y puede consultarse (es decir, no puede usar un objeto generador). Un ejemplo sería cómo Mathematica representa internamente un objeto Matrix

Ejemplos de formatos de entrada:

  1. Una cadena de la forma d f_i/d u_j, donde iy json enteros. Ej: d f_1/d u_2. Tenga en cuenta que estos espacios entre dy f_1o x_2son opcionales. Además, los guiones bajos también son opcionales.
  2. Una cadena de la forma d f_i(u_1,...,u_n)/d u_jo d f_i(u)/d u_j. Es decir, los parámetros de entrada del componente de función f_ison opcionales y pueden explicarse explícitamente o dejarse en forma compacta.
  3. Una salida gráfica formateada. Ej .: qué imprime Mathematica cuando evalúa la expresiónD[f_1[u_,u_2,...,u_n],u_1]

Puede elegir para qué es el índice inicial uy para qué f(especifique en su respuesta). La salida puede ser a cualquier sumidero deseado (estándar, valor de retorno, parámetro de salida, etc.).

Casos de prueba

Los siguientes casos de prueba utilizan la convención m,n. Los índices se muestran basados ​​en 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]]

Puntuación

Este es el código de golf; el código más corto en bytes gana. Las lagunas estándar están prohibidas. Se le permite usar los complementos deseados.

Respuestas:


4

Python, 63 bytes

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

Para m=3,n=2salidas

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

El formato de cadena es 1 byte más corto que el más obvio

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}

La numeración se basa en 1.

-15 bytes gracias a @AlexA. remaks!


1
Puede guardar algunos bytes eliminando el nombre de la función, es decir f=, como es una práctica común aquí. R también devuelve lo último evaluado en una función, por lo que puede usarlo en vlugar de return(v).
Alex A.

1
También debe poder guardar bytes indexando desde 1 en lugar de 0, lo cual está permitido por el OP.
Alex A.

@AlexA. Observaciones muy interesantes, muchas gracias!
Frédéric

El gusto es mio. :)
Alex A.

3

Máximo, 68 bytes

Es una pena que no conozca a Maxima como si conociera a mis queridos C y Matlab. Pero lo intentaré de todos modos.

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

Ejemplo de sesión usando TeXmacs como intérprete de Maxima, principalmente para la representación matemática ordenada:

Maxima sesión en TeXmacs

Puede haber mejores formas de hacer listas y cosas así en Maxima (especialmente me gustaría hacer que las funciones aparezcan sin los marcadores de lista, []), pero no conozco el idioma lo suficientemente bien.


1

Ruby, 53 bytes

festá indexado a 0, uestá indexado a 1. Pruébalo en línea!

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

Cada fila ocupa una línea como una representación de matriz como se ve a continuación. Si no cumple con las especificaciones, avíseme y lo solucionaré.

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

Aparentemente un tenedor de esta respuesta .

Para 3,2devoluciones:

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

0

Jalea, 18 bytes

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

¡Pruébalo!

Dado (m, n) = (3, 2) , impresiones (con espacios marcados como ·:)

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

Toma la entrada como 2 enteros separados por espacios b y, y genera la matriz jacobiana como ycadenas separadas por comas en las blíneas.

¡C en línea! (Ideone) o Test Suite (Ideone)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.