Jacobian matrisini oluşturma


10

Bilinmeyenlerin vektörünü alın resim açıklamasını buraya girinve bazı genel türevlenebilir fonksiyonlar uygulayın resim açıklamasını buraya girin. Daha sonra Jacobian bir matris tarafından şöyle verilir resim açıklamasını buraya girin:

resim açıklamasını buraya girin

Örneğin, m=3ve varsayalım n=2. Sonra (0 tabanlı indeksleme kullanarak)

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Arasında Jacobi fdaha sonra

resim açıklamasını buraya girin

Bu zorluğun amacı bu Jacobian matrisini basmaktır.

Giriş

Programınız / fonksiyon girişi iki pozitif tamsayı olarak almalı mve nbileşenlerinin sayısını temsil, fve usırasıyla. Giriş istenen herhangi bir kaynaktan gelebilir (stdio, fonksiyon parametresi, vb.). Bunların alınma sırasını belirtebilirsiniz ve bu, cevabınıza herhangi bir girdi için tutarlı olmalıdır (lütfen cevabınızı belirtin).

Çıktı

Jacobian matrisini temsil eden bir şey. Bu temsil, Jacobian matrisinin tüm öğelerini açıkça belirtmelidir, ancak her bir terimin kesin formu, neyin farklılaştırıldığı ve neye göre açık olduğu ve her girdinin mantıksal bir sırayla çıktılandığı sürece tanımlanmış bir uygulamadır. Bir matrisi temsil etmek için kabul edilebilir formlara örnek:

  1. Dış listenin her girişinin Jacobian'ın bir satırına karşılık geldiği ve iç listenin her girişinin Jacobian'ın bir sütununa karşılık geldiği listelerin listesi.
  2. Her satırın Jacobian'ın bir satırı olduğu ve bir satırdaki her ayırıcıdan ayrı girişin jacobian sütununa karşılık gelen bir dize veya metin çıktısı.
  3. Bir matrisin grafik / görsel temsili. Örnek: MatrixFormKomutu kullanırken Mathematica tarafından gösterilenler
  4. Her girişin zaten bellekte depolandığı ve sorgulanabildiği başka bir yoğun matris nesnesi (yani bir jeneratör nesnesi kullanamazsınız). Örnek olarak Mathematica'nın dahili olarak bir Matrix nesnesini nasıl temsil ettiği gösterilebilir

Örnek giriş biçimleri:

  1. Formun bir dize d f_i/d u_j, ive jtam sayılardır. Ör: d f_1/d u_2. dVe f_1veya veya arasındaki bu boşlukların x_2isteğe bağlı olduğunu unutmayın. Ayrıca alt çizgiler de isteğe bağlıdır.
  2. Formun bir dizesi d f_i(u_1,...,u_n)/d u_jveya d f_i(u)/d u_j. Yani, işlev bileşeninin giriş parametreleri f_iisteğe bağlıdır ve açıkça belirtilebilir veya kompakt biçimde bırakılabilir.
  3. Biçimlendirilmiş bir grafik çıktı. Örn: ifadeyi değerlendirdiğinizde Mathematica'nın yazdıklarıD[f_1[u_,u_2,...,u_n],u_1]

Sen başlangıç endeksi neyi tercih edebilir uve f(Cevabınız belirtiniz) vardır. Çıkış istenen herhangi bir lavaboya olabilir (stdio, dönüş değeri, çıkış parametresi, vb.).

Test senaryoları

Aşağıdaki test senaryoları sözleşmeyi kullanır m,n. Dizinler 0 tabanlı olarak gösterilir.

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

puanlama

Bu kod golf; bayt cinsinden en kısa kod kazanır. Standart boşluklar yasaktır. İstediğiniz yerleşikleri kullanma izniniz var.

Yanıtlar:


4

Python, 63 bayt

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

İçin m=3,n=2, çıkışlar

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

Dize biçimlendirmesi, daha belirgin olandan 1 bayt daha kısa

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

3

R, 93 78 bayt

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

Numaralandırma 1 tabanlıdır.

@AlexA sayesinde -15 bayt . remaks!


1
İşlev adını kaldırarak birkaç bayt kaydedebilirsiniz, yani f=burada yaygın bir uygulamadır. R ayrıca bir işlevde değerlendirilen son şeyi döndürür, böylece vyerine kullanabilirsiniz return(v).
Alex

1
OP tarafından izin verilen 0 yerine 1 yerine endeksleyerek bayt kaydedebilmeniz gerekir.
Alex

@AlexA. Çok ilginç yorumlar, çok teşekkürler!
Frédéric

Zevkle. :)
Alex

3

Maxima, 68 bayt

Maxima'yı tanımıyorum, sevgili C ve Matlab'ımı biliyormuşum gibi çok kötü. Ama yine de deneyeceğim.

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

TeXmacs'ı Maxima tercüman olarak kullanarak, çoğunlukla düzgün matematik oluşturma için örnek oturum:

TeXmacs'da Maxima oturumu

Maxima'da listeler ve bu şekilde yapmanın çok daha iyi yolları olabilir (özellikle fonksiyonların liste işaretleri olmadan görünmesini istiyorum, []), ancak dili yeterince iyi bilmiyorum.


1

Yakut, 53 bayt

f0 dizinli, u1 dizinli. Çevrimiçi deneyin!

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

Her satır, aşağıda görüldüğü gibi bir dizi olarak bir dizi temsil eder. Spesifikasyonlarla uyumlu değilse, lütfen bana bildirin, düzelteceğim.

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

Çedar , 79 49 bayt

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

Görünüşe göre bu cevap bir çatal .

İçin 3,2getiriler:

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

0

Jöle, 18 bayt

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

Denemek!

Verilen (m, n) = (3, 2) , baskılar (boşluklar olarak işaretlenmiş ·:)

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

0

C, 125 bayt:

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

Girdiyi 2 boşlukla ayrılmış tamsayı b yolarak alır ve Jacobian Matrisini satırlarda yvirgülle ayrılmış dizeler olarak verir b.

C Çevrimiçi! (Ideone) veya Test Paketi (Ideone)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.