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 )

并且当 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.

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

于 2013-02-24T09:32:13.600 回答