Bangun matriks Jacobian

10

Ambil vektor yang tidak diketahui masukkan deskripsi gambar di sini, dan terapkan beberapa fungsi generik yang dapat dibedakan masukkan deskripsi gambar di sini. The Jacobian kemudian diberikan oleh matriks masukkan deskripsi gambar di sinisehingga:

masukkan deskripsi gambar di sini

Misalnya, anggap m=3dan n=2. Kemudian (menggunakan pengindeksan berbasis 0)

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Jacobian dari fsaat itu

masukkan deskripsi gambar di sini

Tujuan dari tantangan ini adalah untuk mencetak matriks Jacobian ini.

Memasukkan

Program / fungsi Anda harus mengambil sebagai input dua bilangan bulat positif mdan n, yang mewakili jumlah komponen fdan umasing - masing. Input dapat berasal dari sumber yang diinginkan (stdio, parameter fungsi, dll.). Anda dapat menentukan urutan penerimaannya, dan ini harus konsisten untuk setiap masukan untuk jawaban Anda (sebutkan dalam jawaban Anda).

Keluaran

Sesuatu yang mewakili matriks Jacobian. Representasi ini harus secara eksplisit menjabarkan semua elemen dari matriks Jacobian, tetapi bentuk persis dari setiap istilah implementasi didefinisikan selama tidak jelas apa yang dibedakan dan sehubungan dengan apa, dan setiap entri dihasilkan dalam urutan logis. Contoh formulir yang dapat diterima untuk merepresentasikan matriks:

  1. Daftar daftar di mana setiap entri daftar luar sesuai dengan deretan Jacobian, dan setiap entri daftar batin sesuai dengan kolom Jacobian.
  2. String atau output tekstual di mana setiap baris adalah deretan Jacobian, dan setiap pembatas memisahkan entri dalam satu baris sesuai dengan kolom jacobian.
  3. Beberapa representasi grafis / visual dari suatu matriks. Contoh: apa yang ditunjukkan oleh Mathematica saat menggunakan MatrixFormperintah
  4. Beberapa objek matriks padat lainnya di mana setiap entri sudah disimpan dalam memori dan dapat ditanyakan (yaitu Anda tidak dapat menggunakan objek generator). Contohnya adalah bagaimana Mathematica secara internal merepresentasikan objek Matrix

Contoh format entri:

  1. String bentuk d f_i/d u_j, di mana idan jbilangan bulat. Ex: d f_1/d u_2. Perhatikan bahwa ruang-ruang ini antara ddan f_1atau x_2opsional. Selain itu, garis bawah juga opsional.
  2. String bentuk d f_i(u_1,...,u_n)/d u_jatau d f_i(u)/d u_j. Yaitu, parameter input dari komponen fungsi f_iadalah opsional, dan dapat dieja secara eksplisit atau dibiarkan dalam bentuk padat.
  3. Output grafis terformat. Mis .: apa yang dicetak Mathematica saat Anda mengevaluasi ekspresiD[f_1[u_,u_2,...,u_n],u_1]

Anda dapat memilih untuk apa indeks awal udan f(tentukan dalam jawaban Anda). Outputnya bisa ke setiap sink yang diinginkan (stdio, nilai balik, parameter output, dll.).

Uji kasus

Kasus uji berikut menggunakan konvensi m,n. Indeks ditampilkan berbasis 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]]

Mencetak gol

Ini adalah kode golf; kode terpendek dalam byte menang. Celah standar dilarang. Anda diizinkan menggunakan bawaan apa pun yang diinginkan.

helloworld922
sumber

Jawaban:

4

Python, 63 byte

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

Untuk m=3,n=2, keluaran

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

Pemformatan string 1 byte lebih pendek dari yang lebih jelas

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

R, 93 78 byte

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

Penomorannya berbasis 1.

-15 byte berkat @AlexA. remaks!

Frédéric
sumber
1
Anda dapat menyimpan beberapa byte dengan menghapus nama fungsi, yaitu f=, seperti yang biasa dilakukan di sini. R juga mengembalikan hal terakhir yang dievaluasi dalam suatu fungsi, jadi Anda bisa menggunakan vsaja return(v).
Alex A.
1
Anda juga harus dapat menyimpan byte dengan mengindeks dari 1 bukannya 0, yang diizinkan oleh OP.
Alex A.
@AlexA. Komentar yang sangat menarik, terima kasih banyak!
Frédéric
Dengan senang hati. :)
Alex A.
3

Maxima, 68 byte

Sayang aku tidak kenal Maxima seperti aku tahu C dan Matlab tersayang. Tapi aku akan mencoba tanpa usaha.

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

Contoh sesi menggunakan TeXmacs sebagai juru bahasa Maxima, sebagian besar untuk rendering matematika yang rapi:

Sesi maksimum dalam TeXmacs

Mungkin ada cara yang lebih baik dalam melakukan daftar dan semacamnya di Maxima (saya terutama ingin membuat fungsi muncul tanpa penanda daftar, []), tapi saya tidak tahu bahasanya dengan cukup baik.

algmyr
sumber
1

Ruby, 53 byte

fadalah 0-diindeks, uadalah 1-diindeks. Cobalah online!

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

Setiap baris menempati satu baris sebagai representasi array seperti yang terlihat di bawah ini. Jika tidak sesuai dengan spesifikasi, beri tahu saya dan saya akan memperbaikinya.

["d f0/d u1", "d f0/d u2", "d f0/d u3"]
["d f1/d u1", "d f1/d u2", "d f1/d u3"]
Nilai Tinta
sumber
1

Cheddar , 79 49 byte

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

Rupanya garpu jawaban ini .

Untuk 3,2pengembalian:

[["df0/du0", "df0/du1", "df0/du2"], ["df1/du0", "df1/du1", "df1/du2"]]
Biarawati Bocor
sumber
0

Jelly, 18 byte

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

Cobalah!

Diberikan (m, n) = (3, 2) , cetakan (dengan spasi ditandai sebagai ·:)

·df0/du0·df0/du1
·df1/du0·df1/du1
·df2/du0·df2/du1
Lynn
sumber
0

C, 125 byte:

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

Mengambil input sebagai 2 integer yang dipisahkan dengan spasi b y,, dan mengeluarkan Matriks Jacobian sebagai ystring yang dipisahkan koma pada bgaris.

C Online! (Ideone) atau Test Suite (Ideone)

R. Kap
sumber