Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Метод Ньютона нахождения корня на Паскале (http://www.tehnari.ru/f41/t41980/)

Veina 13.11.2010 11:55

Метод Ньютона нахождения корня на Паскале
 
Здравствуйте. Помогите, пожалуйста разобраться с программой. Дано уравнение f(x)=1+sin(x)-1.14*exp(-x). Найти наименьший корень уравнения с точностью е=0.00005, используя метод Ньютона. И вывести х0, х1, х2,...,хn. То есть вывести эти приближенные корни, которая прога считает в процессе и мне выдает окончательный результат. Прога считает неправильно. Не пойму в чем дело. Ответ должен быть примерно 0.0666.
Код:

uses crt;
function F(x:real):real;
begin
F:=1+sin(x)-1.14*exp(-x);
end;
function F1(x:real):real;
begin
F1:=cos(x)+1.14*exp(-x);
end;
function Newton(x1,e:real):real;
var x2,b:real;
    t:text;
begin
x2:=x1;
repeat
b:=x2;
x2:=b-F(b)/F1(b);
writeln(x2);
writeln(t,'iteraziia ');
writeln(t,x2);
until abs(x2-b)>e;
Newton:=x2;
end;
var x0,eps:real;
    t:text;
begin
clrscr;
assign(t,'C:\z2.txt');
rewrite(t);
write('vvedite nachalnoe priblizenie x0=');
readln(x0);
write('vvedite tochnost eps=');
readln(eps);
write('X=',Newton(x0,eps):6:7);
readln;
close(t);
end.


Vladimir_S 13.11.2010 13:10

Цитата:

Сообщение от Veina (Сообщение 417220)
Здравствуйте. Помогите, пожалуйста разобраться с программой. Дано уравнение f(x)=1+sin(x)-1.14*exp(-x). Найти наименьший корень уравнения с точностью е=0.00005, используя метод Ньютона. И вывести х0, х1, х2,...,хn. То есть вывести эти приближенные корни, которая прога считает в процессе и мне выдает окончательный результат. Прога считает неправильно. Не пойму в чем дело. Ответ должен быть примерно 0.0666.

Да нет, правильно, это и выдает. Если, конечно, исправить несколько ошибок:
1. Уберите в теле функции Newton повторное введение файловой переменной t - она должна остаться ТОЛЬКО в списке глобальных переменных.
2. В той же функции знак неравенства в условии выхода из цикла должен быть обратным тому, что у Вас, т.е. цикл прерывается, когда разность становится МЕНЬШЕ е.
3. Из тела того же цикла в той же процедуре уберите экранный вывод - только мешает и путает.
4. Исходное значение следует брать близким к искомому корню, например 0.1, ну можно 0.2. Если взять сильно отличающееся, то программа найдет другой корень или вовсе пойдет в разнос.
Вроде всё.
Удачи!

Veina 13.11.2010 16:59

Код:

uses crt;
function F(x:real):real;
begin
F:=1+sin(x)-1.14*exp(-x);
end;
function F1(x:real):real;
begin
F1:=cos(x)+1.14*exp(-x);
end;
function Newton(x1,e:real):real;
var x2,b:real;
    t:text;
begin
x2:=x1;
repeat
b:=x2;
x2:=b-F(b)/F1(b);
writeln(x2);
assign (t,'C:\z2.txt');
rewrite(t);
writeln(t,'iteraziia ');
writeln(t,x2);
until abs(x2-b)<e;
Newton:=x2;
end;
var x0,eps:real;
    t:text;
begin
clrscr;
assign(t,'C:\z2.txt');
rewrite(t);
write('vvedite nachalnoe priblizenie x0=');
readln(x0);
write('vvedite tochnost eps=');
readln(eps);
write('X=',Newton(x0,eps):9:4);
readln;
close(t);
end.

да, все работает. спасибо. последний вопрос. ответ выдается с числом Е в конце. как от него избавится? оставить только 7 знаков после запятой?

Veina 13.11.2010 17:10

и в файл все таки не пишет...(((

Vladimir_S 13.11.2010 19:07

Цитата:

Сообщение от Veina (Сообщение 417334)
и в файл все таки не пишет...(((

Естественно, не пишет! У меня она в таком виде даже не запускается. А всё потому, что Вы проигнорировали пункт 1 в предыдущем посте. Еще раз: уберите строку t:text из функции Newton. Поймите: как только программа обращается к функции, она, видя "t:text" в списке переменных функции, тут же "забывает" о том, что в основном теле Вы уже ввели файл и открыли его, и ждет, что Вы это сделаете повторно.
Начните с этого, дальше будем разбираться.
Кстати, список ГЛОБАЛЬНЫХ переменных принято размещать не после, а до описания процедур и функций.

Veina 13.11.2010 19:40

Код:

uses crt;
var t:text;
    x0,eps:real;
function F(x:real):real;
begin
F:=1+sin(x)-1.14*exp(-x);
end;
function F1(x:real):real;
begin
F1:=cos(x)+1.14*exp(-x);
end;
function Newton(x1,e:real):real;
var x2,b:real;
begin
x2:=x1;
repeat
b:=x2;
x2:=b-F(b)/F1(b);
writeln(x2);
assign (t,'C:\z2.txt');
rewrite(t);
writeln(t,'iteraziia ');
writeln(t,x2);
until abs(x2-b)<e;
Newton:=x2;
end;

begin
clrscr;
assign(t,'C:\z2.txt');
rewrite(t);
write('vvedite nachalnoe priblizenie x0=');
readln(x0);
write('vvedite tochnost eps=');
readln(eps);
write('X=',Newton(x0,eps):9:4);
readln;
close(t);
end.

так?

Vladimir_S 13.11.2010 19:43

Цитата:

Сообщение от Veina (Сообщение 417390)
так?

Так! Только вот формат вывода :9:4 представляется не очень удачным в данном случае. Лучше :9:7.

Veina 13.11.2010 19:50

все. спасибо большушчее за помощь )

Vladimir_S 13.11.2010 19:51

Цитата:

Сообщение от Veina (Сообщение 417397)
все. спасибо большушчее за помощь )

Не за что. Чем можем, как говорится.

nicni 16.04.2011 18:51

Всем привет! помогите пожалуйста, я с подобным вопросом:

найти корень урав-я (уточнив при необхо-ти диапазон [A-B]). 10.31*ln(x+10.42)+40.01=0 на отрезке от A=-9.35943 до B=-10.42000 методом касательных. точность решения EPS:0.000097.


Часовой пояс GMT +4, время: 12:18.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.