方程式の解を見つけるためのより簡単な方法
-
01-10-2019 - |
質問
私は次の方程式を持っています:
f(N): N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));
見つけた関数を作成する必要があります lam
指定されています N
.
今、私は単純なループを使用してそれをやっています:
lam = 0.9999;
n = f(lam);
pow = 0;
delta = 0.1;
while(abs(N - n)) > 0.1 & pow < 10000)
lam = lam - 0.001;
n = f(lam)
pow = pow+1;
end
ループを使用せずに、より正確に解決するにはどうすればよいですか?
解決
あなたが持っている場合
N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))
それからあなたはそれを知っています
(1+lam)^3 = N*(1-lam)*(1+lam^2)
これらの用語を拡大すると仮定しますか?ゼロに等しい実際の係数を持つ1つの単純な立方式に合体しますか?あなたのためにそれを解決する関数はありますか?
答えはイエスです。 1つの解決策はFzeroを使用することかもしれませんが、方程式は単なる1立方の多項式であるため、象徴的なソリューションが必要な場合を除き、根が答えです。シンボリック問題については、シンボリックツールボックスを使用します。
他のヒント
これは、Wolfram AlphaによるN = 10のソリューションです。
http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10
代数ソリューションは、特定のケースで機能します。これは、それがひどく困難ではないためです。問題は、一般に、非線形方程式に反復的な解が必要であることです。推測から始め、特定の方向へのステップ、そしてうまくいけば解に収束することです。一般的に非線形方程式を解くことはできません それなし 反復とループ。
方程式を再配置します 0 = f(x)/g(x)
(どこ f
と g
多項式です)。次に解決します 0 = f(x)
. 。これは十分に簡単なはずです f
立方体になります(http://en.wikipedia.org/wiki/cubic_function#roots_of_a_cubic_function)。実際、Matlabには roots()
これを行う機能。
プロットは、n陽性の場合、間隔[-1,1)に正確に1つの解があることを示唆しています。考慮すべきです ニュートンの方法, 、それはかなり速くゼロの初期推測で収束します。
他の答えで説明されているように、この方程式を閉じた形で解くことができますが、正直に言うと、次数> 2の多項式に対する閉じた形式のソリューションは、結果の条件が不十分である傾向があるため、実際にはあまり役に立ちません。
あなたの特定の多項式については、アレクサンドルにニュートンの方法がおそらく行く方法だということに同意します。
ただし、長期的には、Jenkins-Traub Root-Findingアルゴリズムの実装を書く(またはインターネットから再利用する)ことを強くお勧めします。ウィキペディアは、それを「ブラックボックスの多項式ルートフィンダーの実質的に標準」と説明しており、誇張していません。それは私のすべての多項式解決のニーズを何年も提供してきました。私の経験では、それはニュートンの方法(良い初期推測に依存していない)や固有値ベースの方法よりも堅牢であり、起動するのは非常に速いです。
Nのほとんどの値に対してあなたの問題に対する代数的解決策があります。ここに解決策があります。 ウォルフラムアルファ:
if N+1!=0
x = (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3)/(3 2^(1/3) (N+1))-(2^(1/3) (2 N^2+3 N))/(3 (N+1) (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3))+N/(3 (N+1))
はい、醜いです。
あなたが持っている場合、正確な代数的解、このような大きな醜いソリューションでさえ、数値解よりも常に優れています。 Duffymoが示したように、数値的手法で問題を解決するには反復が必要であり(したがって遅い)、ソルバーはローカルミニマに閉じ込められる可能性があります。