迭代根寻找算法的实现

时间:2013-02-24 09:03:58

标签: delphi math

我需要通过迭代方法实现通过指定精度查找根的算法。该方法的主要思想是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

为什么会这样?我在哪里错误?怎么纠正?

P.S抱歉我的英文

1 个答案:

答案 0 :(得分:3)

您的算法不是root查找程序。回顾一下,您的递归步骤是

C n = f(C n-1

当C n 等于C n-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.

您的代码中的函数也与问题中的函数不匹配。我不知道哪一个是对的。