Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на итерационные циклы

Автор: TheKnyazz 26.10.2008 22:01

Нужна помощь в решении задачи на итерациооные циклы
в общем вот мой код

 program lab4;
uses crt;
const maxiter = 500;
var
x1,x2,dX,E:real; {x1 - Xnach, x2- Xkon, dX- shag, E -tochnost}
n:integer; {schetchik vicheslennih elementov ryada}


function getY(x,E:real):real;
var y,ch:real; {y-znachenie funcii arcctg(x), ch - element ryada}
begin
ch:= 1/x; {pervii element ryada}
y:= -pi/2;
n:=1;

while (abs(ch)>E) do
begin
y:=y+ch;
inc(n);
ch:=ch*(-1)*(2*n+1) /((2*n+3)*x*x); {vichislaem ocherednoi element ryada}
{if (n mod 2) <> 0 then ch:=-ch;}

{podschitivaem kol-vo vicheslennih elementov ryada}

if (n>maxIter) then
begin
write('ryad rashoditsa!');
break;
end;
end;
getY:=y;
end;

begin
clrscr;
writeln('vvedite x1,x2,dX,E:');
readln(x1,x2,dX,E);
if (x1>=(-pi/2)) and (x1<=(pi/2)) and (x2>=(-pi/2)) and (x2<=(pi/2)) then {sootvetvuet oblasti dop. znachenii ? stroim tablicu}
begin

writeln('arcctg(x)------------------------------');
writeln('|X |Y |N'); {shapka tablici}

while (x1<=x2) do
begin
writeln('|',x1,'|',getY(x1,e),'|',n); {postroenie tablici znachenii ot x1 do x2 s shagom dX}
x1:=x1+dX;
end;
writeln('---------------------------------------');

end
else
writeln('nevernie dannie x1<=x2,x=[-pi/2;pi/2]!!');
begin
writeln('nazmite enter');
readln;
end;
end.


помогите пожалуйста. вот условие задачи.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: volvo 26.10.2008 23:15

1) отсутствует проверка на X = 0... Если уж ты пишешь, что X - из интервала -pi/2 .. +pi/2, то будь добр обрабатывать все значения, которые этот интервал попадают... При вводе 0 программа вылетает с делением на 0, что уже нехорошо...

2)


ch:=ch*(-1)*(2*n+1) /((2*n+3)*x*x); {vichislaem ocherednoi element ryada}

неправда... На картинке представлено нечто другое... Что ты здесь делаешь?
Изначально: ch = 1/x
n = 1 -> ch = -3 / (x*x*x)
n = 2 -> ch = 3*5 / (x3*x*x) = 15/x5
(красным выделены предыдущие значения ch)

И так далее... А что должно быть?

Автор: TheKnyazz 26.10.2008 23:22

1)хорошо, насчет нуля учту.
2)В общем я нашел формулу по которой можно вычислить следующий елемент ряда, посредством умножения предыдущего на постоянное выражение...то что там появляется 3 меня жутко пугает.
Я работаю в паскаль абц поэтому команды ватч у меня нету не могу пошагово разобрать.
при н=2 должно получаться 1\5х^3.

Добавлено через 5 мин.
PS, в конце первого сообщения прикреплено условие.

Автор: TheKnyazz 27.10.2008 0:40

добавил проверку 0, избавился от 3. Но числа все равно через чур..
вот доработанный исходник)

program lab4;
uses crt;
const maxiter = 500;
var
x1,x2,dX,E:real; {x1 - Xnach, x2- Xkon, dX- shag, E -tochnost}
n:integer; {schetchik vicheslennih elementov ryada}

function getY(x,E:real):real;
var y,ch:real; {y-znachenie funcii arcctg(x), ch - element ryada}
begin
ch:=1/3*x*x*x; {pervii element ryada}
y:=-pi/2;
n:=1;
y:=y+1/x+ch;
while (abs(ch)>E) do
begin
ch:=ch*(-1)*(2*n+1)/((2*n+3)*x*x);{vichislaem ocherednoi element ryada}
{if (n mod 2) <> 0 then ch:=-ch;}
y:=y+ch;
inc(n); {podschitivaem kol-vo vicheslennih elementov ryada}
if (n>maxIter) then
begin
write('ryad rashoditsa!');
break;
end;
end;
getY:=y;
end;

begin
clrscr;
writeln('vvedite x1,x2,dX,E:');
readln(x1,x2,dX,E);
if (x1>=(-pi/2)) and (x1<=(pi/2)) and (x2>=(-pi/2)) and (x2<=(pi/2)) and (x1<>0) and (x2<>0) then {sootvetvuet oblasti dop. znachenii ? stroim tablicu}
begin

writeln('arcctg(x)------------------------------');
writeln('|X |Y |N'); {shapka tablici}

while (x1<=x2) do
begin
writeln('|',x1,'|',getY(x1,e),'|',n); {postroenie tablici znachenii ot x1 do x2 s shagom dX}
x1:=x1+dX;
end;
writeln('---------------------------------------');

end
else
writeln('nevernie dannie x1<=x2,x=[-pi/2;pi/2]!!');

begin
writeln('nazmyte enter');
readln;
end;
end.

.

Автор: TheKnyazz 27.10.2008 3:09

Вот правильное вычисление арктангенса с помощью итерационнго цикла.

program lab4;
uses crt;
const maxiter = 500;
var x1,x2,dX,E,y:real; {x1 - Xnach, x2- Xkon, dX- shag, E -tochnost}
n:integer; {schetchik vicheslennih elementov ryada}
Procedure getY(x,E:real; var y:real; var n:integer);
var ch:real; {y-znachenie funcii arcctg(x), ch - element ryada}
begin
ch:=x; {pervii element ryada}
n:=0;y:=0;
while (abs(ch)>E) do
begin
y:=y+ch;
ch:=ch*((-1)*x*x)/((2*n+1)); {vichislaem ocherednoi element ryada}
inc(n); {podschitivaem kol-vo vicheslennih elementov ryada}
if (n>maxIter) then
begin
write('ryad rashoditsa!');
break;
end;
end;
end;

begin
clrscr;
repeat
writeln('vvedite x1,x2,dX,E:');
readln(x1,x2,dX,E);
until (x1>=-1) and (x1<=1) and (x2>=-1) and (x2<=1);
{sootvetvuet oblasti dop. znachenii ? stroim tablicu}
writeln;
writeln('-----------------------');
writeln('| X | ARCTG (X) | N |'); {shapka tablici}
while (x1<=x2) do
begin
getY(x1,e,y,n);
writeln('|',x1:5:2,'|',y:11:5,'|',n:2,' |'); {postroenie tablici znachenii ot x1 do x2 s shagom dX}
x1:=x1+dX;
end;
writeln('-----------------------');
writeln('nazmite enter');
readln
end.

.
Спасибо за помощь