• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Метод Ньютона нахождения корня на Паскале

  • Автор темы Автор темы Veina
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.

Veina

Новые
Регистрация
10 Ноя 2010
Сообщения
12
Реакции
0
Баллы
0
Метод Ньютона нахождения корня на Паскале

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

так?
 
все. спасибо большушчее за помощь )
 
Всем привет! помогите пожалуйста, я с подобным вопросом:

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