Консультация № 177414
22.03.2010, 21:46
0.00 руб.
0 9 1
здравствуйте уважаемые эксперты хотела бы попросить вас описать код программы.В ней происходит выявление интервалов корня и нахождение корня интервала , прошу описать код

Приложение:
program korny;
uses crt;
var
x1,x2,x3,h,y1,y2,f1,f2,a,b,c,e,x:real;
g:text;
begin
writeln('ўўҐ¤ЁвҐ ­ з «® Ё Є®­Ґж Ё­вҐаў « ');
readln(x1);
readln(x3);
writeln('ўўҐ¤ЁвҐ и Ј');
readln(h);
x2:=x1+h;
y1:=x2*sin(x2)-1;
while x2<=x3 do
begin
y2:=x1*sin(x1)-1;
if (y1*y2)=0 then
begin
writeln('[',x1:6:2,' ',x2:6:2,']');
a:=x1;
b:=x3+h;
e:=0.0000001;
while (b-a)<e do
begin
c:=(a+b)/2;
f1:=c*sin(c)-1;
f2:=a*sin(a)-1;
if (f1*f2)<0 then
b:=c
else
a:=c;
end;
end;
if (y1*y2)<0 then
begin
writeln('[',x1:6:2,' ',x2:6:2,']');
a:=x1;
b:=x2;
e:=0.000001;
while (b-a)<e do
begin
c:=(a+b)/2;
f1:=c*sin(c)-1;
f2:=a*sin(a)-1 ;
if (f1*f2)<0 then
b:=c
else
a:=c;
end;
assign(g,'Korny.txt') ;
append(g);
x:=(a+b)/2;
writeln (g,'KORNI[',x:6:6);
x1:=x2;
x2:=x2+h;
y1:=x1*sin(x1)-1 ;
close(G);
end
else
begin
x1:=x2;
x2:=x2+h;
y1:= x2*sin(x2)-1;
end;
end;
readln;
end.

Обсуждение

Неизвестный
22.03.2010, 22:31
общий
luba tixomirova:
Что значит описать? - Пояснить?
Неизвестный
22.03.2010, 23:50
общий
luba tixomirova:
Я так думаю, программа находит точки, в которых функция обращяется в ноль.
Если вам надо только техническое описание, то вот оно.
Код:

program korny; //название программы
uses crt;
var
x1,x2,x3,h,y1,y2,f1,f2,a,b,c,e,x:real; //переменные веественного типа
g:text; //переменная, текстовой файл
begin
writeln('введите начало и конец интервала');//выводит строку на экран
readln(x1); //ждет ввода строку и считvваес ее в переменую х1 - начало интервала
readln(x3);//конец интервала
writeln('введите шаг');
readln(h); //шаг поиска
x2:=x1+h;//х2 равно х1+шаг. Делаем шаг в сторону конца интервала
y1:=x2*sin(x2)-1;//находим у(х2) - значение функции в точке
while x2<=x3 do // повторяем, пока х2 меньше или равно х3. Т.е. пока не дойдем до конца интервала или не перескочим через него.
begin
y2:=x1*sin(x1)-1;//находим у(х1) - значение функции в начале интервала
if (y1*y2)=0 then//если у(х1) или у(х2) равно нулю то.
// мое мнение: Если х1 мы задавали, то надо думать, что проверяется не будет ли нужной точкой - точка х2, т.е. не обращяется ли функция в ноль в точке х2. Но почему бы просто не проверить у2?
begin
writeln('[',x1:6:2,' ',x2:6:2,']');
a:=x1;//начало интервала
b:=x3+h;//конец интервала
e:=0.0000001; //точность поиска
while (b-a)<e do//пока не достигнута нужная точность поиска повторяем следующее:
begin
c:=(a+b)/2;//находим середину интервала
f1:=c*sin(c)-1;//вычисляем функцию в точках а и с, т.е. в середине
f2:=a*sin(a)-1;//и начале интервала
if (f1*f2)<0 then //если знаки разные, то смещяем конец интервала на середину - сужаем область поиска.
b:=c
else
a:=c;//смещяем начало на середину
end;
end;
if (y1*y2)<0 then //если знаки разные. Т.е. точки х1 и х2 лежат по разные стороны от точки, в которой функция обращяется в ноль.
begin
writeln('[',x1:6:2,' ',x2:6:2,']');//выводим эти точки
a:=x1;
b:=x2;
e:=0.000001;
while (b-a)<e do
begin
c:=(a+b)/2;
f1:=c*sin(c)-1;
f2:=a*sin(a)-1 ;
if (f1*f2)<0 then
b:=c
else
a:=c;
end;
assign(g,'Korny.txt') ; //ассоциируем файл с переменной
append(g); //открvваем файл для добавления информации(в конец), если файл не существует произойдет ошибка! Надо писать rewrite.
x:=(a+b)/2;//находим Хоптимальное - оптимальный результат.
writeln (g,'KORNI[',x:6:6); //записvваем строку в файл, цифры - общее число знаков, количество знаков после запятой(по-моему, здесь какая-то ошибка!)
x1:=x2;
x2:=x2+h;
y1:=x1*sin(x1)-1 ;
close(G); //закрvваем файл
end
else //если обе точки находятся по одну сторону от нужной(в которой функция обращяется в ноль). НО, мы не знаем с какой стороны они! Т.е. нам надо прибавлять шаг или отнимать...
begin
x1:=x2;
x2:=x2+h;
y1:= x2*sin(x2)-1;
end;
end; //конец цикла while x2<=x3 do
readln; //это нужно чтобv программа не закрvлась
end.

Если же вам надо понять метод решения...
Наверно я что-то путаю, но на мой взгляд в этой программе что-то может быть напутано.
Я не смог понять каким образом она может правильно работать. Завтра еще посмотрю...

Вы уверены в правильности программы?
Неизвестный
23.03.2010, 00:50
общий
Patriotix-N:
не совсем уверена в правильности... задание таково: Задание №1 с помощью ЭВМ отделить корни заданного уравнения Xsinx-1=0
Задание №2Составить программу для вычислениЯ с помощью ЭВМ всех корней заданного уравнения с точность до 10^-6 (использовать метод половинного деления) функция такова XsinX-1=0
задание№1 я сделала вот код
Код:
Program interval;
Uses CRT;
const
FileName = 'interval.txt';
var
t: text;
a,b,h:real; {­ з «®, Є®­Ґж ¤Ё Ї §®­  Ё и Ј}
x1,x2:real; {§­ зҐ­Ёп ЇҐаҐ¬Ґ­­®© е}
y1,y2:real; {§­ зҐ­Ёп ЇҐаҐ¬Ґ­­®© г}
Begin
clrscr;
Writeln('‚ўҐ¤ЁвҐ ­ з «® ¤Ё Ї §®­ ');
readln(a);
Writeln('‚ўҐ¤ЁвҐ Є®­Ґж ¤Ё Ї §®­ ');
readln(b);
Writeln('‚ўҐ¤ЁвҐ и Ј');
readln(h);
x1:=a;
x2:=x1+h;
While (x2<b) do
begin
assign(t,'interval.txt');
append(t);
{ўлзЁб«Ґ­ЁҐ §­ зҐ­Ё© дг­ЄжЁЁ}
y1 := x1*sin(x1) - 1;
y2 := x2*sin(x2) - 1;
If (y1*y2<0) then
Writeln(t,'UHTEPVAL KOPHYA [',x1:3:6,';',x2:3:6,']');{ўлў®¤Ё¬ ў д ©« Ї®«г祭­лҐ ®вўҐвл}
x1:=x2;
x2:=x1+h; {ЇҐаҐЎ®а §­ зҐ­Ё© е Їг⥬ ЇаЁЎ ў«Ґ­Ёп Є ­ з «м­®¬г §­ зҐ­Ёо и Ј }
close(t);
end;
begin
writeln('®вўҐвл ᬮваЁвҐ ў interval.txt');
writeln('¤«п ўл室  ­ ¦¬ЁвҐ ENTER');
readln;
end;
end.
в паскале код посмотрите
и вот надо реализовать Задание №2 тут же в этом коде... буду ждать вашей помоще пожалуйста
Неизвестный
23.03.2010, 09:47
общий
luba tixomirova:
Вот ваше решение, как вижу его я. Но в программе считается, что концы интервала не являются корнями уравнения.
Код:

program korny; //название программы
uses crt;
var
x1,x2,x3,h,y1,y2,f1,f2,a,b,c,e,x:real; //переменные веественного типа
g:text; //переменная, текстовой файл
begin
writeln('введите начало и конец интервала');//выводит строку на экран
readln(x1); //ждет ввода строку и считываес ее в переменую х1 - начало интервала
readln(x3);//конец интервала
writeln('введите шаг');
readln(h); //шаг поиска.
assign(g,'Korny.txt') ; //ассоциируем файл с переменной
rewrite(g);
close(g);
x2:=x1+h;//х2 равно х1+шаг. Делаем шаг в сторону конца интервала
y1:=x2*sin(x2)-1;//находим у(х2) - значение функции в точке
while x2<=x3 do // повторяем, пока х2 меньше или равно х3. Т.е. пока не дойдем до конца интервала или не перескочим через него.
begin
y2:=x1*sin(x1)-1;//находим у(х1) - значение функции в начале интервала
if (y1*y2)=0 then//если у(х2) равно нулю то.
begin
writeln('[',x1:6:2,' ',x2+h:6:2,']');
append(g);
writeln (g,'KORNI[',x2:6:6);
close(g);
x1:=x2+h;//нам надо тобы точка х2 не вошла в новый интервал
x2:=x2+2*h;
y1:= x2*sin(x2)-1;
end;
if (y1*y2)<0 then //если знаки разные. Т.е. точки х1 и х2 лежат по разные стороны от точки, в которой функция обращяется в ноль.
begin
writeln('[',x1:6:2,' ',x2:6:2,']');//выводим эти точки - интервал
a:=x1; //Находим корень этого интервала. Определяем начало
b:=x2;//и конец интервала
e:=0.000001;//точность поиска
while ((b-a)>=e) or (f1<>0) do//повторяем пока интервал не станет меньше или равен заданной точности. Или если середина, которую нашли в последний раз, чудом оказалась корнем.
begin
c:=(a+b)/2; //находим середину
f1:=c*sin(c)-1; //находим значение функции в этой точке
f2:=a*sin(a)-1 ; //находим значение функции в начале интервала
if (f1*f2)<0 then
b:=c //если они по разные стороны, то сокращяем интервал - Переносим конец на середину.
else
a:=c; //а - лежит по левую сторону от корня(выяснено ранее). поэтому если и а и с лежат по одну сторону, то они лежат оп левую сторону от корня. Следовательно смещяем интервал вправао: смещяем начало на середину.
end;
append(g); //открываем файл для добавления информации(в конец)
x:=(a+b)/2;//находим Хопт - оптимальный результат.
writeln (g,'KORNI[',x:6:6); //записvваем строку в файл, цифры - общее число знаков, количество знаков после запятой(по-моему, здесь какая-то ошибка!)
x1:=x2; //смещяем главный интервал вправо.
x2:=x2+h; //для проверки следующего отрезка.
y1:=x1*sin(x1)-1 ;
close(G); //закрvваем файл
end
else //если обе точки находятся по одну сторону от нужной(в которой функция обращяется в ноль). Т.к. х1 слева, то следовательно обе точки находятся по левую сторону.
begin
x1:=x2;
x2:=x2+h;
y1:= x2*sin(x2)-1;
end;

end; //конец цикла while x2<=x3 do

readln; //это нужно чтобы программа не закрылась
end.
Неизвестный
23.03.2010, 16:37
общий
программа так не работает (( только выводится первый интервал и на этом все
Неизвестный
23.03.2010, 18:23
общий
можете пределать пожалуста под мою функцию (XsinX-1) вот этот вот пример и чтоб отрезок был от -40 до 40 с возможность задания интервала


Здесь описан метод половинного деления (дитохомии?). Суть проста. Есть функция f(x), есть интервал [a,b], есть условие, что на концах промежутка функция имеет разный знак: f(a)*f(b)<0. Требуется найти с заданной точностью eps корень этой функции. Поступаем так: выбираем середину отрезка [a,b]. Если в середине функция имеет тот же знак что и слева, то принимаем середину за новую левую границу, в противном случае - за правую. Повторяем до тех пор, пока отрезок не станет меньше eps. В данном примере в качестве функции берем синус, а отрезок - [3,4]. Таким образом мы должны найти число пи.

Код:
function f(x:real):real;
begin
f:=sin(x);
end;
const MaxSteps=200;
var a0,b0,a,b,eps,fa,fb,t,ft:real;
step,sa,sb:integer;
begin
writeln('Нахождение корней функции методом половинного деления:');
a0:=3; {writeln(' Input a0: ');readln(a0);}
b0:=4; {writeln(' Input b0: ');readln(b0);}
eps:=0.0000001; {writeln(' Input eps: ');readln(eps);}
fa:=f(a0); fb:=f(b0);
if (fa*fb>0) then
begin
writeln(' На заданном промежутке корней нет.');
halt;
end;
a:=a0; b:=b0;
step:=0; t:=a; ft:=fa;
while (abs(b-a)>eps) and (step<MaxSteps) do
begin
inc(step);
t:=(a+b)/2;
ft:=f(t);
if (fa*ft>0) then
begin
fa:=ft;
a:=t;
end
else
b:=t;
writeln('step:',step:4,' t=',t,' f(t)=',ft);
end;
if (step>MaxSteps)
then writeln('Отсутствие сходимости. Уточните промежуток.')
else writeln('Найден корень с заданной точностью.');
end.
давно
Мастер-Эксперт
319965
1463
24.03.2010, 23:13
общий
это ответ
Здравствуйте, luba tixomirova.

Посмотрите такой вариант:

Код:
uses crt;

var
a,b,h,e:Real;
x1,x2,x:Real;
g:Text;

function Fun(x:Real):Real;
begin
Fun:=x*sin(x)-1;
end;

function Root(x1,x2,e:Real):Real;
var
x:Real;
begin
while (x2-x1)>=e do
begin
x:=(x1+x2)/2;
if Fun(x1)*Fun(x)<0 then x2:=x else x1:=x;
end;
Root:=(x1+x2)/2;
end;

begin
a:=-40;b:=40;h:=0.1;e:=0.000001;
x1:=a;x2:=a+h;
Assign(g,'D:\Korny.txt');
Rewrite(g);
ClrScr;
while x2<=b do
begin
if Fun(x2)=0 then
begin
Writeln('Found x=',x2:6:2);
Writeln(g,'Root=',x2:6:6);
end
else if Fun(x1)*Fun(x2)<0 then
begin
Writeln('[',x1:6:2,';',x2:6:2,']');
x:=Root(x1,x2,e);
Writeln(g,'Root=',x:6:6);
end;
x1:=x2;
x2:=x2+h;
end;
Close(g);
Readln;
end.

Неизвестный
25.03.2010, 00:36
общий
star9491:
Извеняюсь за назойливость не могли бы сделать техническое описание данного кода присланного автором star9491(огромное спасибо ему в ближайшее время оценю ваш ответ)
Код:
uses crt;

var
a,b,h,e:Real;
x1,x2,x:Real;
g:Text;

function Fun(x:Real):Real;
begin
Fun:=x*sin(x)-1;
end;

function Root(x1,x2,e:Real):Real;
var
x:Real;
begin
while (x2-x1)>=e do
begin
x:=(x1+x2)/2;
if Fun(x1)*Fun(x)<0 then x2:=x else x1:=x;
end;
Root:=(x1+x2)/2;
end;

begin
a:=-40;b:=40;h:=0.1;e:=0.000001;
x1:=a;x2:=a+h;
Assign(g,'D:\Korny.txt');
Rewrite(g);
ClrScr;
while x2<=b do
begin
if Fun(x2)=0 then
begin
Writeln('Found x=',x2:6:2);
Writeln(g,'Root=',x2:6:6);
end
else if Fun(x1)*Fun(x2)<0 then
begin
Writeln('[',x1:6:2,';',x2:6:2,']');
x:=Root(x1,x2,e);
Writeln(g,'Root=',x:6:6);
end;
x1:=x2;
x2:=x2+h;
end;
Close(g);
Readln;
end.
давно
Мастер-Эксперт
319965
1463
25.03.2010, 09:37
общий
luba tixomirova:
Код:
uses crt;

var
a,b,h,e:Real;//[a,b] - отрезок, на котором ищутся корни, h - шаг поиска, e - точность корня
x1,x2,x:Real;//временные переменные ([x1,x2] - текущий отрезок поиска, x - сюда записываем текущий корень)
g:Text;//файл, в который записываются корни

function Fun(x:Real):Real;//функция нули которой ищутся
begin
Fun:=x*sin(x)-1;
end;

function Root(x1,x2,e:Real):Real;//нахождение корня на отрезке [x1;x2] методом деления пополам с точностью e
var
x:Real;
begin
while (x2-x1)>=e do
begin
x:=(x1+x2)/2;
if Fun(x1)*Fun(x)<0 then x2:=x else x1:=x;
end;
Root:=(x1+x2)/2;//возвращаем в качестве результата найденный корень
end;

begin
a:=-40;b:=40;h:=0.1;e:=0.000001;//инициализация исходных данных задачи
x1:=a;x2:=a+h;//первый промежуток поиска
Assign(g,'D:\Korny.txt');Rewrite(g);//инициализация файла для записи корней
ClrScr;
while x2<=b do//цикл сдвига промежутков поиска
begin
if Fun(x2)=0 then//если попали на корень записываем результат в файл
begin
Writeln('Found x=',x2:6:2);
Writeln(g,'Root=',x2:6:6);
end
else if Fun(x1)*Fun(x2)<0 then//если на участке есть корень, то ищем его
begin
Writeln('[',x1:6:2,';',x2:6:2,']');
x:=Root(x1,x2,e);//именно здесь вызываем функцию поиска корня
Writeln(g,'Root=',x:6:6);
end;
x1:=x2; x2:=x2+h;//переходим к следующему промежутку поиска
end;//поиск закончен
Close(g);//закрываем файл
Readln;//смотрим содержимое экрана
end.
Форма ответа