ヤコビ行列を作成する


10

未知数のベクトルを取り、ここに画像の説明を入力してくださいいくつかの一般的な微分可能関数を適用しますここに画像の説明を入力してくださいヤコビアンは、次いで行列によって与えられるここに画像の説明を入力してくださいように。

ここに画像の説明を入力してください

たとえば、と仮定m=3n=2ます。次に(0ベースのインデックスを使用)

ここに画像の説明を入力してください

ここに画像の説明を入力してください

のヤコビアンf

ここに画像の説明を入力してください

この課題の目標は、このヤコビ行列を出力することです。

入力

プログラム/関数は、2つの正の整数mとを入力として受け取る必要nfありuます。これらはそれぞれとのコンポーネントの数を表します。入力は、任意のソース(stdio、関数パラメーターなど)から取得できます。あなたはこれらが受け取られる順序を指示することができ、これはあなたの答えへのどんな入力でも一貫していなければなりません(あなたの答えで指定してください)。

出力

ヤコビ行列を表すもの。この表現は、ヤコビ行列のすべての要素を明示的に記述する必要がありますが、各項の正確な形式は、何が区別され、何が明確であり、すべてのエントリが論理的な順序で出力される限り、実装で定義されます。マトリックスを表すための受け入れ可能なフォームの例:

  1. 外部リストの各エントリがヤコビアンの行に対応し、内部リストの各エントリがヤコビアンの列に対応するリストのリスト。
  2. 各行がヤコビアンの行であり、行の各区切り文字で区切られたエントリがヤコビアンの列に対応する文字列またはテキスト出力。
  3. マトリックスのグラフィック/ビジュアル表現。例:MatrixFormコマンドを使用したときにMathematicaによって表示されるもの
  4. 他のいくつかの密行列オブジェクト。すべてのエントリは既にメモリに格納されており、クエリできます(つまり、ジェネレータオブジェクトを使用できません)。例としては、Mathematicaが内部的にMatrixオブジェクトをどのように表すかが挙げられます

エントリ形式の例:

  1. 形式の文字列。d f_i/d u_jここでi、およびjは整数です。例:d f_1/d u_2df_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バイト

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

番号は1から始まります。

@AlexAのおかげで-15バイト。リマック!


1
f=ここでは一般的な方法として、関数名を削除することで数バイトを節約できます。Rは関数で評価された最後のものも返すので、のv代わりに使用できますreturn(v)
Alex A.

1
また、OPで許可されている0ではなく1からインデックスを付けることでバイトを節約できるはずです。
Alex A.

@AlexA。非常に興味深い発言、ありがとうございました!
フレデリック

どういたしまして。:)
Alex A.

3

Maxima、68バイト

私の親愛なるCとMatlabを知っているように、マキシマを知らないのは残念です。それでも私は試してみます。

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

Teamacsを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}"}}}

以下に示すように、各行は配列表現として1行を占めます。仕様に準拠していない場合はお知らせください。修正します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.