2016-12-02 7 views
0

fsolveを使用すると問題が発生しますが、プログラマがエラーを送信しますが、その理由はわかりません。私はx(2) = 2.96e+13x(1)= 2.72e+22を見つけるはずです。 私の非線形方程式を解くために、私はこれを試してみました:fsolveはを使用した後オクターブ:fsolve関数のエラー

function y = f(x) 

global x_rayon_droite 
global z1 
global r_droite 
global x_rayon_gauche 
global r_gauche 
global y_rayon_droite 
global y_rayon_gauche 

x_rayon_droite=406 
z1=2.72e+22 
r_droite = 556.77 
x_rayon_gauche=179 
r_gauche = 241.42 
y_rayon_droite=381 
y_rayon_gauche=162 


y(1)= x(1).*(x_rayon_droite./z1-x(2)./r_droite.*x_rayon_droite./r_droite)-x(1).*(x_rayon_gauche./z1-x(2)./r_gauche.*x_rayon_gauche./r_gauche)+x_rayon_droite-x_rayon_gauche; 
y(2)= x(1).*(y_rayon_droite./z1-x(2)./r_droite.*y_rayon_droite./r_droite)-x(1).*(y_rayon_gauche./z1-x(2)./r_gauche.*y_rayon_gauche./r_gauche)+y_rayon_droite-y_rayon_gauche; 

endfunction 

[x,info]=fsolve("f",[1e+22;1e13]) 

エラー:事前

Error after using fsolve

はThxを

+0

エラーはどこですか?イメージ内の警告しか見ることができません(これは悪い考えですが、なぜ出力をテキストとして追加していないのですか?) – Andy

+0

プログラムはx1とx2の値で結果を表示しません。 テキストとしてエラーを出力する方法がわかりません。 – Julien563

+0

最初に行うべきことは、関数が失敗した値を確認することです。これを達成するには 'OutputFcn'を使います。 – stephematician

答えて

0

まず最初に、私は2つの方程式と2 unknowsを持っています私は電話を

に変更することです。
[x,val,info]=fsolve("f",[1e+22;1e13],options) 

とオプションの実験。この例では、解析的にヤコビアンを見つけるのは簡単なので、fの2番目の出力として指定し、options.Jacobian="on"と入力してください。別のスケールの変数を扱うために、AutoScaling = "on"を使用すると便利です。

しかし、これは具体的な例ではあまり役に立ちません。実際にはひどくスケーリングされているからです。ここでは、実際の式が何であるかです:私たちは新しい変数zを導入した場合

0.0017615*x(1)*x(2) + (8.346e-21)*x(1) = -227 
0.0015505*x(1)*x(2) + (8.051e-21)*x(1) = -219 

これは線形システムとなって= X(1)* X(2)。しかし、線形システムであっても、ソルバーがあきらめる可能性があるため、ひどくスケーリングされています。代わりにz = (1e+15)*x(1)*x(2)を導入しましょう。最初の列に1e-15を掛けます。そして、線形ソルバーは返し

z = 96810.712 
x(2) = -2.720e+22 

のでx(1) = -3.559e-33

これは、あなたが3-5桁を持っていたことを考えると結果は全く意味がある場合は、1つの不思議を作る非常識な規模の格差、の一種である、あなたの係数。

+0

あなたの答えはたくさんThx! – Julien563

関連する問題