สร้างเมทริกซ์ของจาโคเบียน


10

ใช้เวกเตอร์ของราชวงศ์และใช้บางฟังก์ชั่นอนุพันธ์ทั่วไปป้อนคำอธิบายรูปภาพที่นี่ จาโคเบียนจะได้รับแล้วโดยเมทริกซ์ดังกล่าวว่า:ป้อนคำอธิบายรูปภาพที่นี่ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นสมมติว่าและm=3 n=2จากนั้น (ใช้การจัดทำดัชนีตาม 0)

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะนั้นชาวโคเบียนfนั้น

ป้อนคำอธิบายรูปภาพที่นี่

เป้าหมายของการท้าทายนี้คือการพิมพ์เมทริกซ์จาโคเบียนนี้

อินพุต

โปรแกรม / ฟังก์ชั่นของคุณควรรับข้อมูลเป็นจำนวนเต็มบวกจำนวนเต็มสองตัวmและnแสดงจำนวนส่วนประกอบของfและuตามลำดับ อินพุตอาจมาจากแหล่งที่ต้องการ (stdio, function function, ฯลฯ ) คุณอาจกำหนดลำดับที่ได้รับสิ่งเหล่านี้และสิ่งนี้จะต้องสอดคล้องกับคำตอบของคุณ (โปรดระบุในคำตอบของคุณ)

เอาท์พุต

สิ่งที่แสดงถึงเมทริกซ์ของจาโคเบียน การเป็นตัวแทนนี้จะต้องสะกดองค์ประกอบทั้งหมดของเมทริกซ์ของจาโคเบียนอย่างชัดเจน แต่รูปแบบที่แน่นอนของแต่ละคำจะถูกนำไปปฏิบัติตราบใดที่ไม่มีความชัดเจนในสิ่งที่สร้างความแตกต่างและด้วยความเคารพต่อสิ่งต่างๆ ตัวอย่างแบบฟอร์มที่ยอมรับได้สำหรับการแทนเมทริกซ์:

  1. รายการของรายการที่แต่ละรายการของรายการด้านนอกสอดคล้องกับแถวของ Jacobian และแต่ละรายการของรายการภายในสอดคล้องกับคอลัมน์ของ Jacobian
  2. สตริงหรือเอาต์พุตข้อความที่แต่ละบรรทัดเป็นแถวของ Jacobian และแต่ละตัวคั่นคั่นรายการในบรรทัดสอดคล้องกับคอลัมน์ของ jacobian
  3. การแสดงกราฟิก / ภาพบางส่วนของเมทริกซ์ ตัวอย่าง: สิ่งที่แสดงโดย Mathematica เมื่อใช้MatrixFormคำสั่ง
  4. วัตถุเมทริกซ์หนาแน่นอื่น ๆ ที่ทุกรายการถูกเก็บไว้ในหน่วยความจำแล้วและสามารถสอบถามได้ (เช่นคุณไม่สามารถใช้วัตถุเครื่องกำเนิดไฟฟ้า) ตัวอย่างจะเป็นวิธีที่ Mathematica แสดงถึงวัตถุเมทริกซ์ภายใน

ตัวอย่างรูปแบบรายการ:

  1. สตริงของฟอร์มd f_i/d u_jโดยที่iและjเป็นจำนวนเต็ม d f_1/d u_2Ex: โปรดทราบว่าช่องว่างเหล่านี้ระหว่างdและf_1หรือx_2เป็นทางเลือก นอกจากนี้ขีดล่างยังเป็นตัวเลือก
  2. สตริงของรูปแบบหรือd f_i(u_1,...,u_n)/d u_j d f_i(u)/d u_jนั่นคือพารามิเตอร์อินพุตขององค์ประกอบฟังก์ชั่นf_iเป็นตัวเลือกและสามารถสะกดหรือออกอย่างชัดเจนในรูปแบบกะทัดรัด
  3. เอาต์พุตกราฟิกที่จัดรูปแบบ ตัวอย่าง: Mathematica จะพิมพ์ออกมาเมื่อคุณประเมินนิพจน์D[f_1[u_,u_2,...,u_n],u_1]

คุณสามารถเลือกสิ่งที่ดัชนีเริ่มต้นuและf (โปรดระบุในคำตอบของคุณ) เอาท์พุทอาจจะจมใด ๆ ที่ต้องการ (stdio, ค่าตอบแทน, พารามิเตอร์เอาท์พุท, ฯลฯ )

กรณีทดสอบ

m,nกรณีทดสอบต่อไปนี้จะใช้การประชุม ดัชนีจะแสดงตาม 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]]

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม คุณได้รับอนุญาตให้ใช้บิวด์อินที่ต้องการ

คำตอบ:


4

Python ขนาด 63 ไบต์

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

สำหรับm=3,n=2ผลลัพธ์

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

การจัดรูปแบบสตริงคือ 1 ไบต์สั้นกว่าชัดเจนกว่า

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}

การกำหนดหมายเลขเป็นแบบ 1

-15 ไบต์ขอบคุณ @AlexA remaks!


1
คุณสามารถบันทึกได้สองสามไบต์โดยการลบชื่อฟังก์ชั่นนั่นคือf=วิธีปฏิบัติทั่วไปที่นี่ R ยังส่งกลับเป็นสิ่งสุดท้ายที่ได้รับการประเมินในการทำงานเพื่อให้คุณก็สามารถใช้แทนv return(v)
Alex A.

1
คุณควรจะสามารถบันทึกไบต์ด้วยการสร้างดัชนีจาก 1 แทน 0 ซึ่งได้รับอนุญาตจาก OP
Alex A.

@AlexA คำพูดที่น่าสนใจมากขอบคุณมาก!
Frédéric

ด้วยความยินดี. :)
Alex A.

3

สูงสุด, 68 ไบต์

มันแย่มากที่ฉันไม่รู้จัก Maxima เหมือนฉันรู้จัก C และ Matlab ที่รัก แต่ฉันจะพยายามอย่างไรก็ตาม

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

ตัวอย่างเซสชันที่ใช้ TeXmacs เป็นล่าม Maxima ส่วนใหญ่สำหรับการเรนเดอร์คณิตศาสตร์ที่เรียบร้อย:

เซสชันสูงสุดใน TeXmacs

อาจมีวิธีที่ดีกว่าในการทำรายการและใน Maxima (ฉันต้องการให้ฟังก์ชั่นปรากฏโดยไม่มีเครื่องหมายรายการ []) แต่ฉันไม่รู้ภาษาดีพอ


1

Ruby, 53 ไบต์

fได้รับการจัดทำดัชนี 0 คือจัดทำดัชนีu1 รายการ ลองออนไลน์!

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

แต่ละแถวใช้หนึ่งบรรทัดเป็นตัวแทนอาร์เรย์ตามที่เห็นด้านล่าง หากไม่ตรงตามข้อกำหนดโปรดแจ้งให้เราทราบและฉันจะแก้ไข

["d f0/d u1", "d f0/d u2", "d f0/d u3"]
["d f1/d u1", "d f1/d u2", "d f1/d u3"]


0

เยลลี่ขนาด 18 ไบต์

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

ลอง!

ได้รับ(m, n) = (3, 2) , พิมพ์ (พร้อมช่องว่างที่ทำเครื่องหมายเป็น·:)

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

0

C, 125 ไบต์:

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

ใช้อินพุตเป็นจำนวนเต็มคั่นด้วยช่องว่าง 2 ช่องb yและส่งออก Jacobian Matrix เป็นyสตริงที่คั่นด้วยเครื่องหมายจุลภาคบนbบรรทัด

มันออนไลน์! (Ideone)หรือTest Suite (Ideone)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.