0

反復法によって指定された精度で根を見つけるためのアルゴリズムを実現する必要があります。この方法の主なアイデアはCn=f(Cn-1)です。C0 =(A + B)/ 2; ここで、ルートを構成する間隔のa、b境界。私はこのコードを書きました(Delphi7で)

program iter;

{$APPTYPE CONSOLE}

uses
  SysUtils,Math;

function GetCn(Cn1:Double):Double;
begin
   Result:=Cn1+sin(1/Cn1);
end;

var
  a,b:Double;
  Cn,Cn1:Double;
  eps,eps1:Double;

begin
  a:=1.2;b:=2; 
  Cn:=(a+b)/2;
  Write('Input precision ');Readln(eps);
  eps1:=Abs(Cn-Cn1);
  While eps1>eps do
  begin
    Cn1:=Cn;
    Cn:=GetCn(Cn);
    eps1:=Abs(Cn-Cn1);
  end;
  Writeln(Cn);
  Readln;
end.

テストデータでは、f(x)= x-2 + sin(1 / x); a:= 1.2 b:= 2.0 eps:=0.001私のプログラムは答え1.00000143538244E+ 0003を出しますが、一連の問題には答え1,3077があります

なんでそうなの?どこでエラーになりますか?修正する方法は?

PS私の英語でごめんなさい

4

1 に答える 1

3

あなたのアルゴリズムはルートファインダーではありません。要約すると、再帰的なステップは次のとおりです。

C n = f(C n-1

そして、Cnが許容範囲までCn - 1に等しくなると終了します。

そのアルゴリズムは固定小数点を見つけるかもしれませんが、根を見つけることはありません。根を見つけるには、ニュートン法、二分法、割線法などが必要です。

固定小数点ファインダーとしても、コードは壊れています。コードが初めて終了テストを実行するとき、コードはCn1初期化する前にの値を読み取ります。


コメントでは、間違った質問をしたこと、および固定小数点を見つけようとしていることを示しています。この場合、変数が初期化される前に変数が読み取られないように、コードを変更する必要があります。

begin
  a:=1.2;b:=2; 
  Cn:=(a+b)/2;
  Write('Input precision ');Readln(eps);
  repeat
    Cn1:=Cn;
    Cn:=GetCn(Cn);
    eps1:=Abs(Cn-Cn1);
  until eps1<=eps;
  Writeln(Cn);
  Readln;
end.

また、コード内の関数が質問の関数と一致しません。どちらが正しいかわかりません。

于 2013-02-24T09:32:13.600 に答える