我需要通过迭代方法实现通过指定精度查找根的算法。该方法的主要思想是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抱歉我的英文
答案 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.
您的代码中的函数也与问题中的函数不匹配。我不知道哪一个是对的。