2017-03-09 12 views
1

私はMatlabに関する知識が非常に限られています。一般的なニュートンラフソン関数を作成しようとしていますが、入力引数が足りないというエラーが表示されるたびに発生します。私のコードは、f(関数)、c0(初期推測)、n(ステップ数)の3つの入力が必要です。私は、コマンド・ウィンドウにこれを入れて、私はこの関数は、スクリプトファイルに一般ニュートンメソッド関数ファイルMatlab

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x)); 

を書かれている

function [c] = Q3(f,c0,n) 


for i=1:n 

c(0)=c0; 
f=f(x); 
fp=diff(f,x); 

c(i)=c(i-1)-subs(f,x,c(i-1))/subs(fp,c(i-1)); 

end 


disp(c) 

[C] = Q3(G(x)は、1:これは、これまでの私のコードです、n)それはうまくいくと思っていますが、明らかに私のコードは動作する必要があります。 おかげ

+0

コードが間違っています。 'subs'は記号置換のためのものです。関数を評価したい場合は' f(c(i-1)) 'を実行する必要があります。とりわけ、コードのほとんどは間違っています。 –

+1

おそらく唯一の欠点は、 'f = f(x)'の前のシンボルとして 'x'を宣言して、関数からシンボル式に' f'を正しく変更することです。 – LutzL

+0

@LutzLはい、しかしNRは数値的な方法なので、NRを象徴的に持つことは本当に賢明な考えではありません。シンボリックな表現があれば 'solve'を使って解くことができます。 –

答えて

0

これはトリックを行う必要があり、あなたが述べたように、関数gが定義されている:

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x));

をも、あなたが例えば、nc0を定義する必要があります。

clearvars 

[email protected](x)(sin((pi.*x)/2)+(1/x)-(10.*x)); 

n=10 
c0=1 

c=Q3(g,c0,n) 

をと別のファイルでは、NRの関数を記述します:

function [c] = Q3(f,c0,n) 

h=1e-4; 
c(1)=c0; 

for i=1:n 
    g=f(c(i)); 
    gp=(f(c(i)+h)-f(c(i)-h))/(2*h) 
    c(i+1)=c(i)-g/gp 
end 

disp(c) 

この場合、数値微分近似のためにh=1e-4を選択しますが、変更することができます。私はh<1e-2を提案する。