IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Задача о справедливости равенства!, Помогите исправить, пожалуйста!:=)
Olchik
сообщение 19.11.2007 23:37
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


Люди! Я написала программу на Паскале, но она как-то странно работает. Я не понимаю в каком месте ошибочка. Помогите,ПОЖАЛУЙСТА!
Вот условие задачи:
Численно убедиться в справедливости равенства, для чего для заданного значения аргумента х вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью e. Оценить число итераций, необходимых для достижения заданной точности.
равенство:
mega_chok.gif sinx=x(1-(x*x/(pi*pi))(1-(x*x/4(pi*pi))...(1-(x*x/((n-1)*(n-1)*pi*pi)))....

Вот так вот....
Моя программа:
Program RGZ3;
Uses crt;
var
x,Eps,a,b,y,P:real;
n:integer;
begin
clrscr;
write('Задайте значение аргумента х=');
readln(x);
write('Введите погрешность е=');
readln(Eps);
P:=x;
y:=sin(x);
n:=2;
repeat
a:=((n-1)*(n-1))*pi*pi;
b:=1-((x*x)/a);
n:=n+(n-1);
P:=p*b;
until ABS(y-p)<=Eps;
if ABS(y-p)<=Eps then write('Равенство справедливо')
else write('Равенство не справедливо');
readln;
end.

Заранее ОГРОМНОЕ СПАСИБО!:=) smile.gif

Сообщение отредактировано: Lapp - 20.11.2007 7:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
мисс_граффити
сообщение 20.11.2007 1:21
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Если честно, никаких странностей (кроме нарушения тобой п.2 правил) не заметила.
На больших х вылетает с делением на ноль - ты про это?

Может, напишешь подробнее, в чем проблема? На каких значениях что-то не то получается?
И еще меня немножко смутило
Цитата
n:=n+(n-1);

Это по формуле так?
Почему не n:=n+1?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Olchik
сообщение 20.11.2007 3:44
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


На больших х вылетает с делением на ноль - ты про это?


Да, именно про это.

Цитата
Это по формуле так?
Почему не n:=n+1?


Получается ,чтобы не выходило деление на 0 необходимо первоначально задать п=2. Иначи выходит: 1-1=0, а это знаменатель....Вот...Немного бредово...но всё же.


Спасибо,что откликнулисьsmile.gif

Сообщение отредактировано: Lapp - 20.11.2007 7:35
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sozialist
сообщение 20.11.2007 5:02
Сообщение #4


Клавиатурный тиран
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  -2  +


Чтобы не вылетало на больших углах, нужно заменять их меньшими. Например,

repeat
x:=x-2*Pi; //в силу периодичности функции
until x<=2*Pi


Сообщение отредактировано: Sozialist - 20.11.2007 5:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 20.11.2007 13:06
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Olchik, ты не поняла, что сказала мисс_граффити:
Цитата(мисс_граффити @ 20.11.2007 1:21) *
Цитата
n:=n+(n-1);
Это по формуле так?
Почему не n:=n+1?
Ты ответила:
Цитата(Olchik @ 20.11.2007 3:44) *
Получается ,чтобы не выходило деление на 0 необходимо первоначально задать п=2. Иначи выходит: 1-1=0, а это знаменатель....Вот...Немного бредово...но всё же.
- что совешенно не по теме sad.gif. Да, начинать нужно с n=2 при P=x, кто ж спорит? И ничего бредового в этом нет, даже немного. А вот это твое:
Цитата
n:=n+(n-1);
- это действительно полнейший бред (не немного smile.gif). Конечно, нужно писать так, как намекала мисс_граффити:
n:=n+1;
Это же следует из написанной тобой формулы!.. Понятно?
Цитата(Sozialist @ 20.11.2007 5:02) *

Чтобы не вылетало на больших углах, нужно заменять их меньшими.
...
x:=x-2*Pi; //в силу периодичности функции
Sozialist, ты не прав. Ты еще не доказал, что эта предел этой последовательности действительно синус, а уже пользуешься его, синуса, свойствами.. Нехорошо! smile.gif

Olchik, задача не так проста, как кажется на первый взгляд. В ней есть несколько подводных камней, даже для знающего программиста. Я тебе сейчас немного начну намекать на них, а ты попробуй разобраться и задавай вопросы. Ладно?

1. Во-первых, надо исправить ту ошибку, про которую говорила мисс_граффити, это несомненно.

2. В процессе вычислений получаются очень большие значения. Как ты знаешь, числа, с которыми имеет дело компьютер, ограничены по величине. Например, числа типа real ограничены примерно числом 10^38, а тип double простирается до 10^308. Та последовательность, с которой ты имеешь дело, сходится чрезвычайно медленно, но дело даже не в скорости схождения. Дело в том, что она сначала колеблется с очень большой амплитудой. То есть, прежде, чем сойтись, она очень сильно отклоняется, как в плюс, так и в минус. То есть программа действительно вылетает при больших X, но не из-за ошибки, а из-за ограниченных возможностей машины. Отсюда следуют несколько выводов сразу:
- для n следует использовать не integer тип, а real;
- для всех действительных величин следует использовать не real тип, а double (а может, и extended);
- следует организовать последовательность так, чтобы минимизировать величину промежуточных результатов.
Только пусть у тебя не сложится мнение, что если уж "машина не может, то и стараться нечего". Машина может ВСЕ, если ее правильно использовать..

3. В твоей программе нарушена логика. Посмотри вниметельно: фраза "Равенство не справедливо" в принципе не может быть напечатана, так как мы не можем выйти из цикла, пока не достигли точности Eps. Подумай, что нужно сделать, чтоб исправить это.

И приходи продолжать разговор.. smile.gif))

Теперь от меня, как от администратора.
М
Тут не принято дублировать темы. Начала тут: вычисление с погрешностью((( - надо было тут и продолжать.. Учти это на будущее, пожалуйста



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 17:47
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"