問題タブ [difference-equations]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - MATLABの差分方程式 - 符号を切り替える必要があるのはなぜですか?
おそらく、これは MATLAB の問題というよりも数学の問題であり、よくわかりません。私は MATLAB を使用して経済モデル (New Hybrid ISLM モデル) を計算していますが、作成者がソリューションの符号を切り替えるという紛らわしい手順があります。
最初に、著者はシンボリック変数を宣言し、差分方程式系を設定します。接尾辞「a」と「2t」はどちらも「時間 t+1」を意味し、「2a」は「時間 t+2」を意味し、「t」は「時間 t」を意味することに注意してください。
編集:教科書に表示されるように、マトリックスに入る方程式は次のとおりです(中括弧は期間の値を示し、ギリシャ文字はパラメーターです):
最初の方程式:
2 番目の式:
3 番目と 4 番目はダミーです。
5番目は簡単です:
次に、著者は行列 A を計算します。
私が理解している限りでは、この A はシステムに対するソリューションです。これは、時間 t+1 および t+2 変数を t および t+1 変数に変換する行列です (これは前向きモデルです)。私の質問は、基本的に、この解を得るために B のすべての偏導関数の符号を逆にする必要があるのはなぜですか? 私はこのステップについて話している:
ここで符号を反転すると、明らかに A のすべてのコンポーネントの符号が反転しますが、なぜそれが必要なのか明確に理解していません。質問が不明確な場合、またはこれが質問するのに最適な場所でない場合は、お詫び申し上げます。
matlab - SymbolicToolboxMatlabの差分方程式
誰かが差方程式を解く方法があると教えてもらえますか?例:
Symbolic Toolboxを使用してMatlabで?この方程式の明示的な解を見つけたいと思います。
performance - numpy: 次の計算で前の配列を引数として使用して、行列で関数を評価する
私はm x n
配列を持っています: a
、整数m > 1E6
、およびn <= 5
.
関数FとGがあり、これらは次のように構成されています: F ( u , G ( u , t))。uは1 x n
配列、t はスカラー、FとGは配列を返し1 x n
ます。
Fでそれぞれを評価しrow
、a
前に評価した行を次の評価のu配列として使用する必要があります。そういう評価をする必要があります。m
これは非常に高速でなければなりません。以前、配列全体の評価に感銘を受けましscitools.std
StringFunction
たが、この問題では、前に計算された配列を次の計算の引数として使用する必要があります。StringFunction がこれを実行できるかどうかはわかりません。
例えば:
上記のコードの問題は、非常に遅いことです。これらの計算を数ミリ秒単位で実行する必要があります。
どうすればやりたいことができますか?
ありがとうございました。
敬具、
マリウス
matlab - 伝達関数からの差分方程式、Matlab
Z 変換伝達関数から得られた 2 つの差分方程式の応答をプロットしました。私は 2 つの方法を使用し、2 つの異なる結果を得ました。なんで?
方法 1、Matlab を使用して逆 Z 変換を行う
利回り: y = 2^k - 1、タイムステップ 'k' の場合。これは指数関数です。
方法 2、手で代数的に並べ替え、z^n を (kn) に変換します。
または同等に
また、2 番目の方法では「u」を指定する必要がありますが、最初の方法では必要ありませんが、k のみが必要です。最初の方法が入力信号 u を必要とせず、タイム ステップのみを必要とするのはなぜですか?
differential-equations - マキシマにおける差分/微分代数方程式のシステムの数値解法
まず、差分方程式系 (過度に単純化された Solow-Romer 経済モデル) から始めます。
下t
付き文字は、次のように離散時間を示します。Y[t=0], Y[t=1], Y[t=2], ...
具体的には:
これは、5 つの未知数の 5 つの方程式です。システムを数値的に「解く」ことは、実際には些細なことです。t=0
初期条件から始めて、差分方程式から計算K[1]
しA[1]
、それから計算Y[1]
するだけです。
その些細な性質にもかかわらず、私は実際にそうする方法を決定し、Maxima で結果の曲線をプロットすることができませんでした。
私は微分方程式アプローチ (実際には微分代数的) が Maxima の機能をより助長するのであれば、完全に満足しています。いずれにせよ、それは数値解法で同等である必要があります。
あれは:
しかし、繰り返しになりますが、ルンゲ・クッタやその他の組み込みソルバーを使用して、この系を数値的に解いてプロットする方法がわかりません (これは、上記の代数方程式が の形式で簡単に書き直せる場合でも当てはまります0=f(Y,A,K,Ly,La)
)。
この時点で、私は実際には何の進歩もしていません。微分方程式 ( ) に対して私が目にする唯一のツールはdiff_rec2
、そのようなシステムの記号解のために設計されていますが、一般に、経済モデルは閉じた形式では表現できません。Runge-Kutta ( rk
) は (私が見る限り) 代数方程式を受け入れません。次にどこを見ればよいかわかりません。
最終的には、このモデルや同様のモデルの直接時間計算の性質を考えると、これは非常に簡単だと思います。とはいえ、手動操作を実行したり、これを特別なケースにしたりすることは避けたいと思います。McKinnon (1997) のオープン エコノミーなど、将来的にはより複雑なモデルを実装する予定であるため、このような連立方程式の一般的な解法に特に関心があります。
編集:
Robert's (accepted) Answer のおかげで、上記の転送時間差分方程式の例の完全に機能するコピーと貼り付けのソリューションを次に示します。
matlab - 実数 (および絡み合った) 方程式のペアを解く
一次差分方程式があります: y[n] = z0 * [n-1] + x[n] (2-3)
. 通常、Z 変換を適用してから、「フィルター」関数を使用します。しかし、私の先生はそれを別の方法で行いたいと考えています。
一次差分方程式(2-3)において、yR[n]およびyI[n]は、y[n]の実部および虚部を示すものとする。yR[n-1]、yI[n-1]、x[n]、r、cos m、sin m を使って yR[n] と yI[n] を表現する一対の実数値差分方程式を書きなさい。
(言及するのを忘れていました、x[n]=G*dirac[n] ここで、G は複素定数で、r、cos m、sin m の由来です)。
これが私の結果です(これは私が考えることができる最高のものです):
それでは次の質問です。
この実数方程式のペアを実装する MATLAB プログラムを作成し、このプログラムを使用して、r=1/2、m=0、および m=pi/4 の式 (2-3) のインパルス応答を生成します。これら 2 つのケースについて、得られたインパルス応答の実部をプロットします。複素数再帰からの出力の実部と比較 (2-3)
私が理解していないのは、z変換を適用してから「フィルター」機能を使用する以外に、これを行う方法です。ウェブで調べたところ、状態空間形式について何かがありましたが、それが関連しているかどうかはわかりません。また、銀の大皿で解決策を手渡してもらうつもりはありません。解決方法を知りたいだけです。どうもありがとうございました!
r - data.table に累積計算を記述する方法
逐次累積計算
各行で計算される値は、前の行で計算された結果に依存する時系列計算を行う必要があります。の便利さを利用したいと考えていますdata.table
。実際の問題は水文モデルです。つまり、各時間ステップで降雨量を加算し、現在の水量の関数として流出と蒸発を差し引く、累積的な水収支計算です。データセットには、さまざまな盆地とシナリオ (グループ) が含まれています。ここでは、問題の簡単な図を使用します。
計算の単純化された例は、時間ステップ (行) ごとに次のようになりますi
。
a
とb
はパラメータ値のベクトルで、v
は結果のベクトルです。最初の行 ( i == 1
) では、 の初期値はv
と見なされv0 = 0
ます。
最初の試み
私の最初の考えは、で使用することshift()
でしたdata.table
。望ましい結果を含む最小限の例は次のとおりv.ans
です。
これは機能しません。shift(v)
元の列のコピーがv
1 行分シフトされるためです。への割り当ての影響を受けませんv
。
cumsum() と cumprod() を使用して方程式を構築することも検討しましたが、それもうまくいきません。
ブルートフォースアプローチ
したがって、便宜上、関数内で for ループを使用します。
この累積関数は、data.table で正常に機能します。
私の質問
data.table
私の質問は、 for ループや関数定義を使用せずに、この計算をより簡潔で効率的な方法で記述できないかということです。set()
おそらく使用していますか?
それとも、より良いアプローチがありますか?
編集:より良いループ
以下の David の Rcpp ソリューションifelse()
は、for
ループから を削除するきっかけになりました。
vcalc2()
よりも 60% 高速ですvcalc()
。