Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на итерационные циклы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
TheKnyazz
Нужна помощь в решении задачи на итерациооные циклы
в общем вот мой код
 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
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
1)хорошо, насчет нуля учту.
2)В общем я нашел формулу по которой можно вычислить следующий елемент ряда, посредством умножения предыдущего на постоянное выражение...то что там появляется 3 меня жутко пугает.
Я работаю в паскаль абц поэтому команды ватч у меня нету не могу пошагово разобрать.
при н=2 должно получаться 1\5х^3.

Добавлено через 5 мин.
PS, в конце первого сообщения прикреплено условие.
TheKnyazz
добавил проверку 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
Вот правильное вычисление арктангенса с помощью итерационнго цикла.

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.

.
Спасибо за помощь
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.