Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2008, 17:44   #1
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию задача на итерационные циклы.

Товарищи, нужна помощь в решении задачи на итерациооные циклы. Условие тривиальное вычислить арктангенс по формуле
вот мой исходник, помогите пожалуйста найти ошибку. компилироваться компилируется, но считать никак не хочет.

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;
ch:=ch*(-1)*(2*n+1) /((2*n+3)*x*x); {vichislaem ocherednoi element ryada}
{if (n mod 2) <> 0 then ch:=-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)) 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.
Изображения
Тип файла: jpg 4.jpg (9.1 Кб, 144 просмотров)
TheKnyazz вне форума Ответить с цитированием
Старый 26.10.2008, 21:09   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Я в математике плохо разбираюсь, но какая-то у Вас странная формула. У Вас при х=0 функция не определена, хотя arctg0 определен и равен 0.
В Википедии другая формула, там нет -pi/2 и х в степени находится в числителе и все нормально работает. У Вас даже если избежать х=0, то при х близких к 0 вылетают такие дикие значения, каких не может быть.
puporev вне форума Ответить с цитированием
Старый 26.10.2008, 21:25   #3
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

да-да, я уже заметил ошибку насчет нуля. Ну я не могу сделать другую формулу, в моей лабе дана именно с -pi/2. Смысл сделанного мной в том, что я поделил следующий член убывающией прогресии на данный и получил постоянное число, которое и умножается. вот немного модернизированный исходник.
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;
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 вне форума Ответить с цитированием
Старый 26.10.2008, 21:25   #4
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

условие было приложено в первом сообщении, в рисунке.
TheKnyazz вне форума Ответить с цитированием
Старый 26.10.2008, 21:50   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Во вложении нормальная формула и нормальная программа, которая правильно считает arctg x на интервале [-1.1]. Ваша формула считает совсем не то и разбираться я с ней не хочу.
Вложения
Тип файла: doc arctg x разложение в ряд.doc (23.5 Кб, 15 просмотров)
Тип файла: rar ARCTG.rar (710 байт, 18 просмотров)
puporev вне форума Ответить с цитированием
Старый 26.10.2008, 21:56   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Еще хочу добавить про ошибочность Вашей формулы. pi/2 это угол, а мы к нему прибавляем или вычитаем тангенс угла. (x - это тангенс угла). Где же логика? Это, извините за грубое сравнение, как складывать количество коров с их надоями.
P.S. Хоть и не очень понимаю в этом, но поведение функции на данном интервале, напоминает функцию ctg x.

Последний раз редактировалось puporev; 26.10.2008 в 22:06.
puporev вне форума Ответить с цитированием
Старый 26.10.2008, 22:19   #7
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

мм, действительно, я правда считал, что pi/2 это 1.57.
Огромное вам спасибо!
Но моя форумла действительно кривая...полностью с вами согласен.я даже в скалькулятором не могу посчитать арктангенс по ней....ваша правда, тоже не компилится))
Но это именно мои бока, у меня стоит х64 ось, а на ней работает только паскаль абц. Надеюсь на защите прокатит. Не могли бы вы сказать каким компилятором пользовались?
TheKnyazz вне форума Ответить с цитированием
Старый 26.10.2008, 22:27   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Turbo Pascal 7.0. Но на АВС у меня все точно также, АВС лего компилирует программы, сделанные на Турбо.
puporev вне форума Ответить с цитированием
Старый 26.10.2008, 22:33   #9
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

А у меня вот какая ошибка

Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.IO.DirectoryNotFoundExceptio n: Не удалось найти часть пути "C:\Users\������\Desktop\ARCTG" .
в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
в System.IO.Directory.SetCurrentDirec tory(String path)
в PascalABCCompiler.Compiler.Compile( )'

на сколько я понял у меня плюханные дллки компилятора стоят.
TheKnyazz вне форума Ответить с цитированием
Старый 26.10.2008, 22:40   #10
TheKnyazz
Пользователь
 
Регистрация: 26.10.2008
Сообщений: 40
По умолчанию

Все я нашел и уничтожил ошибку, огромное вам спасибо! надо было скачать и докинуть дллки поддержки типа увеличенного вещественного числа. И еще несколько неизвестных длл), еще раз огромное спасибо!
TheKnyazz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклы на Паскале. vlad1991 Помощь студентам 34 22.06.2012 13:13
Циклы! vlad1991 Паскаль, Turbo Pascal, PascalABC.NET 15 28.10.2008 22:07
Циклы (Pascal) Дима82 Помощь студентам 4 07.06.2008 17:07
Итерационные циклы Андрюха из ПХТТ Паскаль, Turbo Pascal, PascalABC.NET 3 14.02.2008 15:49