Xây dựng ma trận Jacobian


10

Lấy vectơ của ẩn số nhập mô tả hình ảnh ở đây, và áp dụng một số hàm phân biệt chung nhập mô tả hình ảnh ở đây. Các Jacobian sau đó được đưa ra bởi một ma trận nhập mô tả hình ảnh ở đâynhư vậy:

nhập mô tả hình ảnh ở đây

Ví dụ, giả sử m=3n=2. Sau đó (sử dụng lập chỉ mục dựa trên 0)

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Jacobian fsau đó là

nhập mô tả hình ảnh ở đây

Mục tiêu của thử thách này là in ma trận Jacobian này.

Đầu vào

Chương trình / chức năng của bạn nên dùng như là đầu vào hai số nguyên dương mn, trong đó đại diện cho số của các thành phần của futương ứng. Đầu vào có thể đến từ bất kỳ nguồn nào mong muốn (stdio, tham số hàm, v.v.). Bạn có thể ra lệnh theo thứ tự nhận được những thứ này và điều này phải phù hợp với bất kỳ đầu vào nào cho câu trả lời của bạn (vui lòng ghi rõ trong câu trả lời của bạn).

Đầu ra

Một cái gì đó đại diện cho ma trận Jacobian. Biểu diễn này phải đánh vần rõ ràng tất cả các yếu tố của ma trận Jacobian, nhưng hình thức chính xác của mỗi thuật ngữ được triển khai được xác định miễn là không rõ ràng những gì đang được phân biệt và liên quan đến những gì, và mọi mục nhập được xuất ra theo thứ tự hợp lý. Ví dụ các hình thức có thể chấp nhận để biểu diễn một ma trận:

  1. Một danh sách các danh sách trong đó mỗi mục của danh sách bên ngoài tương ứng với một hàng của Jacobian và mỗi mục của danh sách bên trong tương ứng với một cột của Jacobian.
  2. Một chuỗi hoặc đầu ra văn bản trong đó mỗi dòng là một hàng của Jacobian và mỗi mục được phân tách bằng dấu phân cách trong một dòng tương ứng với một cột của jacobian.
  3. Một số đại diện đồ họa / hình ảnh của một ma trận. Ví dụ: những gì được hiển thị bởi Mathicala khi sử dụng MatrixFormlệnh
  4. Một số đối tượng ma trận dày đặc khác trong đó mọi mục nhập đã được lưu trữ trong bộ nhớ và có thể được truy vấn (tức là bạn không thể sử dụng đối tượng trình tạo). Ví dụ sẽ là cách Mathicala thể hiện bên trong một đối tượng Ma trận

Các định dạng mục nhập ví dụ:

  1. Một chuỗi có dạng d f_i/d u_j, ở đâu ijlà số nguyên. Vd : d f_1/d u_2. Lưu ý rằng những khoảng trắng giữa df_1hoặc x_2là tùy chọn. Ngoài ra, dấu gạch dưới cũng là tùy chọn.
  2. Một chuỗi có dạng d f_i(u_1,...,u_n)/d u_jhoặc d f_i(u)/d u_j. Nghĩa là, các tham số đầu vào của thành phần chức năng f_ilà tùy chọn và có thể được viết rõ ràng hoặc để lại ở dạng rút gọn.
  3. Một đầu ra đồ họa được định dạng. Ví dụ: những gì Mathicala in khi bạn đánh giá biểu thứcD[f_1[u_,u_2,...,u_n],u_1]

Bạn có thể chọn chỉ số bắt đầu cho uflà gì (vui lòng ghi rõ trong câu trả lời của bạn). Đầu ra có thể là bất kỳ mức chìm nào mong muốn (stdio, giá trị trả về, tham số đầu ra, v.v.).

Các trường hợp thử nghiệm

Các trường hợp thử nghiệm sau đây sử dụng quy ước m,n. Các chỉ mục được hiển thị dựa trê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]]

Chấm điểm

Đây là mã golf; mã ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn bị cấm. Bạn được phép sử dụng bất kỳ tích hợp nào mong muốn.

Câu trả lời:


4

Python, 63 byte

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

Đối với m=3,n=2, đầu ra

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

Định dạng chuỗi ngắn hơn 1 byte so với rõ ràng hơn

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

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}

Việc đánh số là dựa trên 1.

-15 byte nhờ @AlexA. làm lại!


1
Bạn có thể lưu một vài byte bằng cách xóa tên hàm, nghĩa là f=, đó là cách làm phổ biến ở đây. R cũng trả về điều cuối cùng được đánh giá trong một hàm, vì vậy bạn chỉ có thể sử dụng vthay vì return(v).
Alex A.

1
Bạn cũng có thể lưu byte bằng cách lập chỉ mục từ 1 thay vì 0, được OP cho phép.
Alex A.

@AlexA. Nhận xét rất thú vị, cảm ơn rất nhiều!
Frédéric

Hân hạnh. :)
Alex A.

3

Tối đa, 68 byte

Thật tệ khi tôi không biết Maxima như tôi biết C và Matlab thân yêu của tôi. Nhưng tôi sẽ cố gắng hàng tháng.

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

Phiên ví dụ sử dụng TeXmac làm trình thông dịch Maxima, chủ yếu để hiển thị toán gọn gàng:

Phiên tối đa trong TeXmacs

Rất có thể có nhiều cách tốt hơn để làm danh sách và như vậy trong Maxima (tôi đặc biệt muốn làm cho các chức năng xuất hiện mà không có các điểm đánh dấu danh sách, []), nhưng tôi không biết ngôn ngữ này đủ rõ.


1

Ruby, 53 byte

flà 0 chỉ mục, ulà 1 chỉ mục. Hãy thử trực tuyến!

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

Mỗi hàng chiếm một dòng dưới dạng một đại diện mảng như được thấy dưới đây. Nếu nó không tuân thủ thông số kỹ thuật, xin vui lòng cho tôi biết và tôi sẽ sửa nó.

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

Thạch, 18 byte

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

Hãy thử nó!

Cho (m, n) = (3, 2) , in (với khoảng trắng được đánh dấu là ·:)

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

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

Lấy đầu vào là 2 số nguyên được phân tách bằng dấu cách b yvà xuất Ma trận Jacobian dưới dạng ycác chuỗi được phân tách bằng dấu phẩy trên bcác dòng.

C Nó trực tuyến! (Ideone) hoặc Test Suite (Ideone)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.