Консультация № 184671
04.12.2011, 09:45
111.24 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Помогите решить задачу.
Составить программу вычисления таблицы значений функции, заданной в виде разложения в ряд. Значение функции вычислять с точностью e (эпсилон)>0, т.е. вычисление суммы членов ряда необходимо прекратить, когда абсолютная величина очередного члена ряда разложения окажется меньше e: l ак l <e.

При вычислении очередного члена целесообразно воспользоваться рекурентным выражением:
ак+1как; к= 0, 1, 3, ...,
где ак - некоторый к-ый член ряда; ак+1 - следующий к+1-ый член ряда; ск - коэффициент, определяемый номером к.


При составлении программы необходимо по возможности воспользоваться операторами организации циклов WHILE, REPEAT, FOR.
Границы интервала вычислений функций a и b, величина шага изменения аргумента h и точность вычисления функции e задаются при вводе. На печать выводятся номер по порядку, значение аргумента, соответствующие ему, значение функции и номер члена ряда, на котором закончилось вычисление значение функции.

Функция задана на рисунке:



Составить программу на языке Borland Pascal. Не использовать при разработке программы - процедуры и функции.

Обсуждение

Неизвестный
04.12.2011, 11:36
общий
это ответ
Здравствуйте, Посетитель - 386678!
Вот вариант решения (BP 7.0):
Код:
uses
crt;
const
en = 5;
var
a, b, h, x, sqrx, el, fx, e: real;
i, count: integer;

begin
clrscr;
write('a = ');
readln(a);

write('b = ');
readln(b);

write('h = ');
readln(h);

write('e = ');
readln(e);

writeln('#':5, ' ':3, 'X', ' ':9, 'f(X)', ' ':6, '#i');

x := a;
count := 1;
while (x<=b) do begin
sqrx := sqr(x);
fx := 1;
i := 1;
el := 1;
repeat
el := (el/i) * sqrx;
if (abs(el) < e) then
break;
if odd(i) then
fx := fx - el
else
fx := fx + el;
inc(i);
until false;
writeln(count:5, ' ':3, x:7:en, ' ':3, fx:7:en, ' ':3, i);
x := x + h;
inc(count);
end;
writeln;
writeln('Done. Press any key...');
readkey;
end.

Пожелания принимаются.
5
Неизвестный
04.12.2011, 15:18
общий
При запуске программы на BP7 и вводе значения x=4 и больше, выводит ошибку №205: Переполнение плавающей запятой...
Неизвестный
04.12.2011, 15:36
общий
У меня есть подобная программа, но с использованием процедур и функций и для другого примера. Её нужно переделать под мою функцию... Вот ссылка на этот файл:
Прикрепленные файлы:
29d5d89dde2f9d70bfc06b055adbf4f5.rar
Неизвестный
04.12.2011, 15:55
общий
04.12.2011, 15:56
Как можно увидеть, результаты работы программы выводятся на экран в виде таблицы:
[table]
[row][col] № [/col][col] x [/col] [col] f(x) [/col] [col] № чл.р. [/col][/row]
[row][col] 1 [/col][col] [/col][col] [/col] [col] [/col][/row]
[row][col] 2 [/col][col] [/col][col] [/col] [col] [/col][/row]
[row][col] 3 [/col][col] [/col][col] [/col] [col] [/col][/row]
[row][col] ... [/col][col] [/col][col] [/col] [col] [/col][/row]
[/table]
Неизвестный
04.12.2011, 18:42
общий
Смотрите исправленный ответ в верхней части страницы.
Цитата: 386678
При запуске программы на BP7 и вводе значения x=4 и больше, выводит ошибку №205: Переполнение плавающей запятой...

К сожалению, ваша функция не приемлет ЛЮБЫХ значений для проверки. Числитель для некоторых значений функции до некоторых пор растет гораздо быстрее знаменателя, что и вызывает ошибку потери точности - накладные расходы и ограничения машинного представления чисел. В приведенном вами примере функция cos гораздо более сильно ограничена в значениях функции.
Я изменил алгоритм подсчета. После этого максимальное значение на котором программа все еще производит вычисления - не меньше 9 (девяти). На десяти снова происходит переполнение. Ну и представление в "табличном" виде тоже есть.
Неизвестный
04.12.2011, 22:42
общий
04.12.2011, 22:42
У меня вопрос насчет вычисления факториала. Если я не ошибаюсь то функция inс увеличивает значение переменной т.е. i:=i+1. И поэтому каждый раз при проходе цикла значение переменной i будет увеличиваться на 1 (т.е. 1, 2, 3, 4, 5...n); Но факториал вычислялся по другой формуле, что то типа:

s:=1;
for i:=1 to n do
s:=s*i;
Неизвестный
04.12.2011, 23:31
общий
Цитата: 386678
У меня вопрос насчет вычисления факториала. Если я не ошибаюсь то функция inс увеличивает значение переменной т.е. i:=i+1. И поэтому каждый раз при проходе цикла значение переменной i будет увеличиваться на 1 (т.е. 1, 2, 3, 4, 5...n); Но факториал вычислялся по другой формуле, что то типа:
s:=1;
for i:=1 to n do
s:=s*i;


Это касается как раз той части о которой я сказал в предыдущем сообщении "изменил алгоритм подсчета":
Переменная el содержит в себе значение вычисленное на предыдущем шаге (в нем уже "учтены" для числителя - x^2k, а для знаменателя - факториал предыдущей итерации -> k!). Значит если я разделю значение el на текущее значение итерации, то, тем самым как будто-бы вычислю факториал на текущей итерации, но для получения значения на текущей итерации мне нужно еще результат домножить на квадрат значения икс. Во избежание переполнения сперва выполняется деление, а уже потом умножение.
(x^(2k-2) * x^2)/k! => [(x^(2k-2)/(k-1)] * (x^2)/(k) => {в квадратных скобках как раз предыдущий элемент} => el * ((x^2)/(k)) => el/k * x^2,
что записано строкой
Код:
el := (el/i) * sqrx;
, квадрат икса вычисляется один раз для каждого значения икс, во избежание совсем необязательных временнЫх расходов.

Как-то так.
Если еще остались вопросы - велкам.
Неизвестный
05.12.2011, 00:08
общий
Думаю пока вопросов нет... Но по мере возникновения буду писать...
Форма ответа