2013-02-24 3 views
0

Мне нужен алгоритм для поиска корней с заданной точностью с помощью итерационного метода. Основная идея этого метода - Cn = f (Cn-1); С0 = (А + В)/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 (х) = х-2 + Sin (1/х); a: = 1.2 b: = 2.0 eps: = 0.001 моя программа дает ответ 1.00000143538244E + 0003, но в комплекте проблем ответ 1,3077

Почему это так? Где я ошибаюсь? Как исправить?

P.S К сожалению Ф.О. мой английский

+0

Этот алгоритм для меня не похож на корневой искатель. Как вы думаете, что называется этим словом? –

+0

[Russian Wikipedia] (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

+0

Ваш код настолько плохой, что его трудно исправить. 'Cn1' не инициализируется,' Cn' может означать как значение аргумента, так и значение функции ... – kludg

ответ

3

Ваш алгоритм не является корнем искатель. Напомним, ваш рекурсивный шаг

C п = F (C п-1)

и вы прекратить, когда C п равна C п-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

+0

Я обновил свой ответ, чтобы ответить на это новое откровение. –

+1

@DavidHeffernan это звучит так, как будто вы только что сделали его домашнее задание для него. – 2013-02-24 20:39:23

Смежные вопросы