0

私は行列を持っていますA

A=[ x.^2 + y , 0;
    0 , x.^2 + y ] 

演算子行列もありますD:

D = [d/dx  ,  0;
     0   ,  d/dy ]

乗算D*Aして、次のような行列になるようにしたい:

 B =    [ diff(A(1,1),x) , 0 ;
         0  , diff(A(2,2),y) ]

diff() 関数は関数を乗算できる演算子ではないため、明らかにこれを行うことはできません。では、記号演算子を使用してこれを行うにはどうすればよいでしょうか? 実際には、行列が大きいため、演算子の乗算なしで実行することは望ましくありません。

また、上記のマトリックスを作成する方法を見つけたBとしましょう。これは次のようになります。

B =
[ 2*x, 0
   0, 1]

Bたとえば、で評価するにはどうすればよいですかx=2, y=1;

私の試み:

subs(B,x,2,y,1)

しかし、これは明らかにsym.subs関数の間違った引数です

私も試しました:

subs(B,2,1) 

それもうまくいかなかったので、私の他の質問は、マトリックスの代わりにどのように代用できるxかですyB

4

2 に答える 2

0

2 番目の質問: シンボリック変数を複数の値に置き換える構文は次のとおりです。

subs(B, {x,y}, {2,1})

(そしてhelp subs、Matlab コマンド プロンプトで入力すると、この例が表示されます)。

まず、シンボリック導関数をベクトル化して計算を高速化するというあなたの考えはうまくいきません。ベクトル化は、配列を処理するように設計された既存の C++ ライブラリによって大量に実行できる低レベルの操作に適しています。記号微分はまったく異なるものです。式ごとに実行される洗練されたアルゴリズムがあります。for ループを使用して複数のシンボリック導関数を見つけることは、いくつであっても適切です。時間がかかる場合は、シンボリック導関数をたくさん取るのに時間がかかるためです。

私が探している可能性のある最適化の 1 つは、行列 B の関数間で共通の要素を見つけて、一度微分できるようにすることです。ただし、これには、マトリックスに含まれる関数の詳細を操作する必要があります。

于 2016-01-07T01:29:56.340 に答える