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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2012, 21:19   #1
smotra88
 
Регистрация: 20.12.2012
Сообщений: 6
По умолчанию Надо разобраться с паскалем!

Текст программы
Код:
{Первый блок - название программы, где program - зарезервированное слово, а TakeTheRoot - собственно имя программы. Дополнительные параметры опускаются, так как в них нет необходимости.}
program TakeTheRoot;

{Второй блок - разделы описаний и раздел операторов}
{1. подключамые модули}
uses CRT;
{2. метки опускаем}
{3. устанавливаем константы; e определяет точность вычисления}
const e = 0.0001;
{4. перечисляем переменные и их типы} 
var prog_repeat: Integer; 
y, x0, x1, result: Real; 

{Далее идет тело программы. Оно всегда начинается с ключевого слова begin.}
begin
{Краткое введение в программу для пользователя}
writeln('***************************************************************');
writeln('Данная программа позволяет вычислить корень заданного уравнения.');
writeln('Все, что Вам необходимо сделать - ввести значение переменной y.');
writeln('У Вас есть 10 попыток, что позволит Вам экспериментировать.');
writeln('с различными значениями. Будьте внимательны при вводе данных.');
writeln('****************************************************************');
{Устанавливаем начальное значение переменной prog_repeat}
prog_repeat := 0;
{Запускаем цикл десятикратного повторения программы, чтобы пользователь мог экспериментировать с разными значениями x}
repeat
{Увеличиваем значение переменной prog_repeat на 1}
prog_repeat := prog_repeat + 1;
{Выводим строку на экран}
if prog_repeat = 10 
{Если это десятая попытка - выводим строку на экран: "Последняя попытка"}
then write(prog_repeat, '. Последняя попытка: ')
{Если еще не дошли до десятой попытки, то выводим стандартную строку}
else write(prog_repeat, '. Пожалуйста, введите любое действительное число, равное или больше -1 и нажмите Enter: ');
{Ввод числового значения}
read(y);
{Проверка значения, введенного пользователем}
if y < -1 
{Если значение переменной меньше -1 выдается сообщение об ошибке}
then begin
write ('ВНИМАНИЕ! Введенное Вами значение меньше -1. Пожалуйста, введите действительное число, равное или больше -1 и нажмите клавишу Enter: ');
read(y);
end;
{Устанавливаем исходное значение x0} 
x0 := 1;
x1 := 1;
{Запускаем цикл при условии, если абсолютное значение разницы между значениями x1 и x0 больше или равно e}
while (abs(b-x0)>= e) do 
begin
{Помещаем значение x1 полученнное при предыдущей итерации в x0}
x0 := x1;
{Вычисляем x1}
x1 := 2.73*sqrt(x0)-cos((1.5*x0)/2)+x0-y;
b := x1;
end;
result := x1;
{Если все в порядке, выводим на экран результат вычислений}
writeln('Результат вычислений: ', result);
until prog_repeat = 10;
{Тело программы закрывается с помощью ключевого слова end и в конце всегда ставится точка.}
end.
Задача - разобраться с математикой - итерациями и написать алгоритм на математическом языке. потом математические знаки заменишь на знаки языка паскаль

Последний раз редактировалось Stilet; 29.12.2012 в 21:59.
smotra88 вне форума Ответить с цитированием
Старый 29.12.2012, 21:22   #2
smotra88
 
Регистрация: 20.12.2012
Сообщений: 6
По умолчанию

вот тесты
Тест №1. Проверка исполнения функции ввода-ввывода информации.
Ожидаемая реакция: программа выведет на экран строку с предложением ввести числовое значение, после ввод и нажатия Enter, произведет вычисление.
Собственно тест: Запускается программа с помощью Turbo Pascal (Shift+F9). При запуске на экран выводится текст с информацией о программе, а также предложение ввести числовое значение. После ввода числового значения выводится на экран результат вычисления – вещественное число.
Результат: скрипт ввода-вывода работает корректно.
Тест №2. Проверка обработки ошибок скриптом.
Ожидаемая реакция: при вводе значения, меньше -1, программа выводит сообщение об ошибке и предложение ввести корректное число.
Собственно тест: вводим значение -2, программа выводит на экран строку с сообщением об ошибке. Вводим -1. Программа произвела вычисление и вывела результат на экран.
Результат: обработчик работает корректно.
Тест №3. Проверка работы цикла «попыток».
Ожидаемая реакция: при вводе корректных данных программа дает десять попыток, нумеруя их от 1 до 10. При последней попытке вместо стандартной строки выводиться строка «Последняя попытка».
Собственно тест: вводим десять раз значение 1. Программа 9 раз выдает стандартную строку и после ввода значения производит вычисление. На 10 раз выводится ожидаемая строка.
Результат: цикл работает корректно.
Тест №4. Проверка цикла вычисления итераций с заданной точностью.
Ожидаемый результат: программа выведет на экран корректное значение с точностью до 10-4
Тест: результат вычисления не соответствует пределу точности, выявлена логическая ошибка.
Результат: рекомендуется выводить все промежуточные значения x1 – тогда вы увидите, что оно просто расходится. Чтобы сходилось, надо применить метод "релаксации" и изменить "знак" производной функции
1. легко заметить, что если x0 - корень уравнения f(x)=0, значит для любой функции s(x) справедливо f(x)*s(x)=0
2. метод итерации для решения уравнения g(x)=x сходиться только если модуль производной |g'(x)| < 1
3. чтобы решить уравнение f(x)=y, выберем g(x) в виде
g(x) = s(x)*(f(x)-y)+x - надо подобрать s(x) такое, чтобы выполнялось условие (2) причем вместо s(x) достаточно взять константу, значение константы подгоняется под макс. значение производной на диапазоне рассматриваемых. "иксов". Итого - заменить x1 := 2.73*sqrt(x0)-cos((1.5*x0)/2)+x0-y; на x1:= S*(2.73*sqrt(x0)-cos((1.5*x0)/2)-y) + x0; где S=-0.01 .
решение!

1. легко заметить, что если x0 - корень уравнения f(x)=0, значит для любой функции s(x) справедливо f(x)*s(x)=0

2. метод итерации для решения уравнения g(x)=x сходиться только если модуль производной |g'(x)| < 1

3. чтобы решить уравнение f(x)=y, выберем g(x) в виде g(x) = s(x)*(f(x)-y)+x - надо подобрать s(x) такое, чтобы выполнялось условие (2) причем вместо s(x) достаточно взять константу, значение константы подгоняется под макс. значение производной на диапазоне рассматриваемых "иксов"

итого - пусть попробуют заменить x1 := 2.73*sqrt(x0)-cos((1.5*x0)/2)+x0-y; на что-то типа x1:= S*(2.73*sqrt(x0)-cos((1.5*x0)/2)-y) + x0; где S=-0.01 ;
smotra88 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
надо разобраться pankofff Свободное общение 0 01.09.2011 21:27
Надо разобраться Ponkole Помощь студентам 0 12.10.2010 19:17
Люди кто поможет с Паскалем ? курсовую сдать надо BO4A Помощь студентам 6 27.05.2009 13:46
[B]Ну правда же, помогиет, сложности у меня с Паскалем...Очень надо Пару задачек![/B] Neytrino Помощь студентам 3 16.05.2009 22:54