2013-02-24 87 views
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

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

对不起我的英语

+0

该算法看起来不像根找到我。你觉得算法的名字是什么? – 2013-02-24 09:11:49

+0

[俄文维基百科](http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BF%D1%80%D0%BE %D1%81%D1%82%D0%BE%D0%B9_%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8#。 D0.9C.D0.B5.D1.82.D0.BE.D0.B4_.D0.BF.D1.80.D0.BE.D1.81.D1.82.D0.BE.D0.B9_.D0。 B8.D1.82.D0.B5.D1.80.D0.B0.D1.86.D0.B8.D0.B8)关于它 – skeeph 2013-02-24 09:15:09

+0

你的代码太糟糕了,很难纠正。 'Cn1'没有初始化,'Cn'可以表示参数值和函数值... – kludg 2013-02-24 09:16:25

回答

3

您的算法不是根查找程序。简而言之,您的递归步骤是

Çň = F(C N-1

与您终止当C ň等于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. 

而且在你的代码的功能不匹配之一的问题。我不知道哪一个是对的。

+0

好吧,我问讲师,他回答说我必须找到固定点,而不是根。我如何改进我的代码? – skeeph 2013-02-24 09:49:25

+0

我更新了我的答案,以解决这个新的启示 – 2013-02-24 09:54:24

+1

@DavidHeffernan这听起来像你只是做了他的家庭作业。 – 2013-02-24 20:39:23