Construa a matriz jacobiana

10

Pegue o vetor de incógnitas insira a descrição da imagem aquie aplique alguma função diferenciável genérica insira a descrição da imagem aqui. O jacobiano é então dado por uma matriz insira a descrição da imagem aquital que:

insira a descrição da imagem aqui

Por exemplo, suponha m=3e n=2. Então (usando a indexação baseada em 0)

insira a descrição da imagem aqui

insira a descrição da imagem aqui

O jacobiano de fé então

insira a descrição da imagem aqui

O objetivo deste desafio é imprimir essa matriz jacobiana.

Entrada

Seu programa / função deve ter como entrada dois números inteiros positivos me n, que representam o número de componentes de fe urespectivamente. A entrada pode vir de qualquer fonte desejada (stdio, parâmetro de função, etc.). Você pode ditar a ordem em que eles são recebidos, e isso deve ser consistente para qualquer entrada na sua resposta (especifique na sua resposta).

Resultado

Algo que representa a matriz jacobiana. Essa representação deve explicitar explicitamente todos os elementos da matriz jacobiana, mas a forma exata de cada termo é a implementação definida, desde que não seja ambíguo o que está sendo diferenciado e com relação ao que, e toda entrada é emitida em uma ordem lógica. Exemplos de formas aceitáveis ​​para representar uma matriz:

  1. Uma lista de listas em que cada entrada da lista externa corresponde a uma linha do jacobiano e cada entrada da lista interna corresponde a uma coluna do jacobiano.
  2. Uma sequência de caracteres ou saída de texto em que cada linha é uma linha do jacobiano e cada entrada separada por delimitador em uma linha corresponde a uma coluna do jacobiano.
  3. Alguma representação gráfica / visual de uma matriz. Exemplo: o que é mostrado pelo Mathematica ao usar o MatrixFormcomando
  4. Algum outro objeto de matriz densa, onde todas as entradas já estão armazenadas na memória e podem ser consultadas (ou seja, você não pode usar um objeto gerador). Exemplo seria como o Mathematica representa internamente um objeto Matrix

Formatos de entrada de exemplo:

  1. Uma cadeia de caracteres do formulário d f_i/d u_j, onde ie jsão números inteiros. Ex: d f_1/d u_2. Observe que esses espaços entre de f_1ou x_2são opcionais. Além disso, os sublinhados também são opcionais.
  2. Uma sequência do formulário d f_i(u_1,...,u_n)/d u_jou d f_i(u)/d u_j. Ou seja, os parâmetros de entrada do componente de função f_isão opcionais e podem ser explicitamente explicitados ou deixados em formato compacto.
  3. Uma saída gráfica formatada. Ex .: o que o Mathematica imprime quando você avalia a expressãoD[f_1[u_,u_2,...,u_n],u_1]

Você pode escolher qual é o índice inicial ue o que fé (especifique na sua resposta). A saída pode estar em qualquer coletor desejado (estado, valor de retorno, parâmetro de saída, etc.).

Casos de teste

Os seguintes casos de teste usam a convenção m,n. Os índices são mostrados com base em 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]]

Pontuação

Isso é código de golfe; o código mais curto em bytes vence. As brechas padrão são proibidas. Você tem permissão para usar quaisquer embutidos desejados.

helloworld922
fonte

Respostas:

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=2, saídas

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

A formatação da string é 1 byte menor que a mais óbvia

lambda m,n:[["df%d/du"%i+`j`for j in range(n)]for i in range(m)]
xnor
fonte
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}

A numeração é baseada em 1.

-15 bytes graças a @AlexA. remaks!

Frédéric
fonte
11
Você pode salvar alguns bytes removendo o nome da função, ou seja f=, como é prática comum aqui. R também retorna a última coisa avaliada em uma função, para que você possa usar em vvez de return(v).
Alex A.
11
Você também deve salvar bytes indexando 1 em vez de 0, o que é permitido pelo OP.
Alex A.
@AlexA. Observações muito interessantes, muito obrigado!
Frédéric
O prazer é meu. :)
Alex A.
3

Máximos, 68 bytes

É uma pena que eu não conheça Maxima, como conheço meus queridos C e Matlab. Mas vou tentar mesmo assim.

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

Exemplo de sessão usando o TeXmacs como intérprete do Maxima, principalmente para renderização matemática pura:

Sessão Maxima no TeXmacs

Pode muito bem haver maneiras melhores de fazer listas no Maxima (eu gostaria especialmente de fazer as funções aparecerem sem os marcadores de lista, []), mas não conheço o idioma o suficiente.

algmyr
fonte
1

Ruby, 53 bytes

fé indexado em 0, ué indexado em 1. Experimente online!

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

Cada linha ocupa uma linha como uma representação de matriz, como mostrado abaixo. Se não for compatível com as especificações, informe-me e eu o corrigirei.

["d f0/d u1", "d f0/d u2", "d f0/d u3"]
["d f1/d u1", "d f1/d u2", "d f1/d u3"]
Value Ink
fonte
1

Queijo Cheddar , 79 49 bytes

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

Aparentemente, um garfo desta resposta .

Para 3,2devoluções:

[["df0/du0", "df0/du1", "df0/du2"], ["df1/du0", "df1/du1", "df1/du2"]]
Freira Furada
fonte
0

Geléia, 18 bytes

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

Experimente!

Dado (m, n) = (3, 2) , imprime (com espaços marcados como ·:)

·df0/du0·df0/du1
·df1/du0·df1/du1
·df2/du0·df2/du1
Lynn
fonte
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");}}

Pega entrada como 2 inteiros separados por espaço b ye gera a Matriz Jacobiana como yseqüências de blinhas separadas por vírgula .

C It Online! (Ideone) ou Suite de Teste (Ideone)

R. Kap
fonte