問題タブ [equation-solving]
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.
string - アルゴリズム - 1 つの変数で線形方程式を解く
文字列形式の式が与えられた場合、x について解きます。式の x の最大べき乗は 1 になります。使用できる演算子は +、*、および - です。これらはすべて二項演算子です。したがって、2x は 2*x と記述されます。すべての演算子の後には、単一の項または定数が続きます。
たとえば、次の式を考えてみましょう。
2*x+5-(4*x-7+(4-2))=10*x-9
これは完全に有効な方程式です。1*2*3 の形式の式は無効ですが、1*(2*3) は有効です。
このような方程式が与えられた場合、x の解を見つける必要があります。方程式が無効な場合、プログラムはエラー メッセージを表示する必要があります。
誰かがこの問題を解決する方法について何か考えを与えることができますか? 今頭に浮かんでいるのは、文脈自由文法を使用した字句解析と構文解析だけです。しかし、それよりもはるかに簡単な解決策があると感じています。誰かがそれに光を当てることができますか?
matrix - 半正定値行列を正確に分解し、線形方程式で下三角部分を使用する方法
n 個の任意の px 1 ベクトル x_i、pxk 行列 A_i、および npxp 正定値行列 S_i があり、*S_i* の一部 (多くの場合、ほとんど) は同じです (たとえば、2 つの異なる S 行列のみが適用され、1 つの正定行列が適用されます)。 i=1,..., n-1 および i=n の半正定 S)。すべての x_i と A_i に対して次の線形変換を行いたい:
x_i* = inv(L_i)x_i および
A_i* = inv(L_i)A_i、ここで
L_i は下三角行列であるため、L_i L'_i=S_i (または、D_i が対角行列の場合、L_i D_i L'_i=S_i よりも優れています)。
n は数個から数千個、またはそれ以上の範囲で、p は通常 10 未満、k は通常 100 未満です。Sにはゼロを含む行と列を含めることができ、元は _BB' として形成されます。ここで、B は下三重対角行列です。ただし、これらの B は使用できません。
精度を重視して、速度と精度の点でこれを達成する最適な方法は何でしょうか?
現在、私は自分で書いた LDL 分解関数をさまざまな S に使用し、L を反転して変換を計算しています。これは、少数の異なる S と大きな n のケースを扱ってきたからです。私が正しく理解していれば、精度の点で行列を明示的に反転せずに線形方程式を解く方が賢明ですが、速度のためにはより良いオプションのようです?
私は Fortran を使用しており、安定しているとは保証できない独自の LDL 分解などではなく、因数分解に LAPACK 関数を使用したいと考えていますが、どちらが良い方法かわかりません。
matlab - 非線形方程式を解く
MATLAB で 2 つの非線形方程式を解きたいので、次のようにしました。
私のスクリプトの一部
myfunc
機能は次のとおりです
私には2つの未知数がx(1)
あり、x(2)
私の質問は、呼び出すたびに値(、、)を渡す方法c
ですか?ii
jj
myfunc
またはこのエラーを克服する方法Undefined function or method 'c' for input arguments of type 'double'.
ありがとう
matlab - matlabで記号方程式を解く方法
X parameter に従ってMatlabに方程式があります。F(x) のランダムな量の X の量を見つけたいです。そして私は以下のコードを試しました。しかし、私の式には1つの結果しかないはずですが、2つの異なる結果が得られます。
roots(f)
代わりに試してみsolve(f)
ましたが、エラーが発生しました:
??? タイプ 'sym' の入力引数に対して未定義の関数またはメソッド 'isfinite' です。
誰でもこれで私を助けることができますか? 私は何をすべきか ?この問題の解決について間違った考えがある場合でも、教えてください。ありがとうございました
関数 betaDistribution_2(a,b)
matlab - MATLAB は対数でシステムをシンボリックに解く -- ソルバーが解を見つけられないのはなぜですか?
連立方程式を対数でシンボリックに解こうとしています (したがって、推定係数は弾性です) が、matlab は「明示的な解が見つかりませんでした」と表示します。理由はありますか?
[編集] アリからの入力に基づいて、次のことを試しました。
別の解決ステートメントも試しました:
しかし、まだ運がありません。
[編集] あるマシンだけで問題であることが判明しました-元のアプローチは別のコンピューターでうまく機能しました.
java - 一部のリンからマトリックスソルバーを使用して、マトリックスのパラメトリックソリューションを取得する方法はありますか? 代数Javaライブラリ?
私が遭遇したすべてのマトリックスソルバーは、マトリックスが正方で可逆であることを必要としますが、正方ではなく複数の解を持つマトリックスについてはどうすればよいでしょうか...どうすればJavaを使用してこれのパラメトリック形式を見つけることができますか?
matlab - MATLAB で 2 つの変数を持つ 2 つの複雑な方程式を解くにはどうすればよいですか?
私はこれらの2つの方程式を持っています:
ここで、 y1=y2 、 MATLABのみを使用して "a" と "b" の正確な値を見つけたいと考えています。
これらの 2 つの方程式を解くために使用する必要がある MATLAB コマンドはありますか??
ps:solve
コマンドを使用しようとしましたが、答えがありません:
それは私にこれを与えます:
c++ - 非線形システムを数値的に解くのに最適なライブラリまたはソフトウェアは何ですか?
私は、制約 (最小および最大許容値) を持つ 8 つの変数で 7 年生の 8 つの多項式のシステムを持っています。
この種の問題を攻撃するための最も効率的な「パッケージ」は何かについての経験と知識はありますか? Mathematica、Matlab、C++ / Java の数学ライブラリ、...
私はいくつかの素朴なアプローチを試みましたが、結果は良くありませんでした....だから今、私はそれを安全にプレイしようとしています(可能な限り)
どうもありがとう
matlab - Matlab: オプティマイザー/ソルバーの精度が低い
Matlab のルート検索問題で十分な精度を達成するのに苦労しています。関数 があり、 whereLik(k)
の値を見つけたいと考えています。基本的に、問題は、さまざまな組み込みの Matlab ソルバー ( 、、) が、私が望む、または期待するほど解に近づいていないことです。k
Lik(k)=L0
fzero
fminbnd
fmincon
Lik()
は、数値逆ラプラス変換などを計算するための広範なコーディングを伴うユーザー定義関数であるため、完全なコードは含めません。しかし、私はこの機能を広範囲に使用しており、適切に機能しているようです。 Lik()
は実際にはいくつかの入力パラメーターを取りますが、現在のステップでは、これらは を除いてすべて固定されてk
います。したがって、これは実際には 1 次元の求根問題です。
k >= 165.95
whichの値を見つけたいですLik(k)-L0 = 0
。Lik(165.95)
よりも小さく、ここから単調に増加するL0
と予想しています。Lik(k)
実際、Lik(k)-L0
関心のある範囲で評価でき、スムーズにゼロを横切るように見えますLik(165.95)-L0 = -0.7465, ..., Lik(170.5)-L0 = -0.1594, Lik(171)-L0 = -0.0344, Lik(171.5)-L0 = 0.1015, ... Lik(173)-L0 = 0.5730, ..., Lik(200)-L0 = 19.80
。したがって、関数は適切に動作しているように見えます。
ただし、いくつかの異なる方法でルートを「自動的に」見つけようとしましたが、精度は期待したほど良くありません...
Using fzero(@(k) Lik(k)-L0)
: interval に制約されている場合は(165.95,173)
、 を返しfzero
ます。さて、素晴らしいことではありませんが。そして実用的な目的のために、多くの手作業による試行錯誤がなければ、そのような正確な上限を知ることはできません. interval を使用すると、where が返されますが、これはかなり貧弱です。Displayをiterに設定してこれらのテストを実行したので、何が起こっているのかがわかります。4 回目の反復でヒットし、5 回目の反復でそこにとどまっているように見えます。つまり、1 つの反復から次の反復への変化が少ないことを意味します。よりもk=170.96
Lik(k)-L0=-0.045
(165.95,200)
fzero
k=167.19
Lik(k)-L0 = -0.65
fzero
167.19
k
TolX
(0.001 に設定) し、手順は終了します。終了フラグは、解に正常に収束したことを示します。
また、 ( の上限と下限を指定) と( の開始点を指定)abs(Lik(k)-L0)
を使用して最小化を試みたところ、同様の精度の問題が発生しました。特に、 との両方を設定できますが、これら (10^-6 まで下げると、必要以上に高い精度) をいじっても、違いはありませんでした。紛らわしいことに、オプティマイザーは、以前の反復で、返される最終的な k 値よりも目的関数をゼロにすることに近い k 値を見つけることさえあります。fminbnd
k
fmincon
k
fmincon
TolX
TolFun
そのため、アルゴリズムは特定のポイントまで反復しているように見えますが、より良い解決策を見つけるのに十分なサイズのステップをそれ以上実行できません。アルゴリズムが別の大きな一歩を踏み出さない理由を誰か知っていますか? これを変更するために調整できるものはありますか?( optimsetの下のリストを見ましたが、有用なものは何も思いつきませんでした。)
どうもありがとう!