2013-02-24 92 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