构造雅可比矩阵


10

取未知向量在此处输入图片说明,并应用一些通用的微分函数在此处输入图片说明。的雅可比然后通过矩阵给出在此处输入图片说明,使得:

在此处输入图片说明

例如,假设m=3n=2。然后(使用基于0的索引)

在此处输入图片说明

在此处输入图片说明

雅可比f然后

在此处输入图片说明

这个挑战的目标是打印这个雅可比矩阵。

输入值

你的程序/功能应该采取作为输入两个正整数mn,其代表的部件的数目fu分别。输入可以来自任何所需的来源(stdio,功能参数等)。您可以指定接收顺序,对于输入的答案必须一致(请在答案中指定)。

输出量

代表雅可比矩阵的东西。此表示形式必须明确拼出Jacobian矩阵的所有元素,但是每个术语的确切形式都是实现定义的,只要明确区分什么以及关于什么进行区分,并且每个条目均以逻辑顺序输出。用于表示矩阵的示例可接受形式:

  1. 列表列表,其中外部列表​​的每个条目都对应于雅可比行的一行,内部列表的每个条目都对应于雅可比行的列。
  2. 字符串或文本输出,其中每行是Jacobian行,每行中由定界符分隔的条目对应于jacobian的列。
  3. 矩阵的一些图形/视觉表示。示例:使用MatrixForm命令时Mathematica显示的内容
  4. 其他每个条目都已存储在内存中并且可以查询的密集矩阵对象(即,您不能使用生成器对象)。例如,Mathematica如何在内部表示Matrix对象

条目格式示例:

  1. 形式为的字符串d f_i/d u_j,其中ij是整数。例如:d f_1/d u_2。请注意,df_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]]

计分

这是代码高尔夫;以字节为单位的最短代码获胜。禁止出现标准漏洞。允许您使用所需的任何内置函数。

Answers:


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字节

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

编号从1开始。

-15个字节,感谢@AlexA。改头换面!


1
您可以通过删除函数名称来节省一些字节,即f=,这是此处的常见做法。R还返回函数中最后求值的内容,因此您可以使用v代替return(v)
Alex A.

1
您还应该能够通过从1而不是0进行索引来保存字节,这是OP所允许的。
Alex A.

@AlexA。非常有趣的话,非常感谢!
弗雷德里克

我的荣幸。:)
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会话

在Maxima中,可能存在更好的方法来进行列表等操作(我特别想使函数在没有列表标记[[]的情况下出现),但是我对语言的了解不够。


1

Ruby,53个字节

f是0索引,u是1索引。在线尝试!

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

1

切达79个 49字节

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

显然,这是一个答案

为了3,2回报:

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

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 yyb行上的逗号分隔字符串输出Jacobian矩阵。

C在线!(Ideone)测试套件(Ideone)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.