Вычисляем приближённое значение ряда
Рассмотрим простую задачку из матана: как посчитать конечную сумму ряда приближенно в scilab, задав предварительно точность для сравнения с аналитическим значением.
Постановка задачи
Вычислить приближенное значение бесконечной суммы \( \frac{1}{1\cdot 3} + \frac{1}{2\cdot 4} + \frac{1}{3\cdot 5}...\) с точностью \( \varepsilon = 0,0001 \). Сравнить полученный результат c точным значением, равным \( 0.75 \)
Вводим входные параметры
Создадим заглушку функции, которая принимала бы от пользователя на вход точность и значение, к которому будем приближаться:
/* функция с проверкой точности и допустимого числа итераций */
function myRange(accuracy, etalonSum)
/*тело функции*/
endfunction
myRange(1e-4, 3/4); // передаём в качестве параметров точность и сумму к которой стремимся
Заготовка функции
Задание необходимых параметров в функции
Для подсчета суммы в пользовательской функции нам потребуется:
- накопитель \(curSum \):
- текущая ошибка \(curErr \):
- счетчик итераций \(n \)
- и максимальное число суммирований чтобы не упасть в бесконечный цикл \(maxIteration \):
При этом, \(myRange \) функция примет вид:
/* функция с проверкой точности и допустимого числа итераций */
function myRange(accuracy, etalonSum)
disp(etalonSum); //посмотрим, к чему стремимся
curSum = 0; //накопитель для суммы, которую будем считать в цикле
curErr = abs(curSum - etalonSum); //текущая разница с эталонной суммой
n = 1; // номер итерации
maxIteration = 10001; // количество суммируемых элементов
endfunction
Подготовка к циклу подсчета ряда
Подсчет частичной суммы в цикле
Создадим цикл с ограничением на допустимое отклонение от эталона и максимальное число итераций
while ( curErr > accuracy ) && (n <= maxIteration) // проверим точность и не привысили ли допустимое количество итераций
/*тут будет код*/
end
Условия продолжения суммирования
На каждом шагу цикла будем:
-- прибавлять одно слагаемое ряда
...
curSum = curSum + 1/(n*(n+2)); // суммируем ряд
...
Накапливаем сумму
-- считать отклонение от заданного значения
...
curErr = abs(curSum - etalonSum);
...
Считаем ошибку
-- увеличивать счетчик
...
n = n + 1; //увеличиваем счетчик
...
Итерация++
В итоге, цикл примет вид:
while ( curErr > accuracy ) && (n <= maxIteration) // проверим точность и не привысили ли допустимое количество итераций
curSum = curSum + 1/(n*(n+2)); // суммируем ряд
curErr = abs(curSum - etalonSum);
n = n + 1; //увеличиваем счетчик
end
Циклу подсчета ряда
Добавим в пользовательскую цункцию ещё и вывод промежуточных результатов, чтобы отслеживать происходящее. Окончательно, программа, осущетсвляющая подсчет ряда на scilab будет выглядеть:
clc; // чистим консоль
/* функция с проверкой точности и допустимого числа итераций */
function myRange(accuracy, etalonSum)
disp(etalonSum); //посмотрим, к чему стремимся
curSum = 0; //накопитель для суммы, которую будем считать в цикле
curErr = abs(curSum - etalonSum); //текущая разница с эталонной суммой
n = 1; // номер итерации
maxIteration = 10001; // количество суммируемых элементов ( надо 10000 )
while ( curErr > accuracy ) && (n <= maxIteration) // проверим точность и не привысили ли допустимое количество итераций
curSum = curSum + 1/(n*(n+2)); // суммируем ряд
// выводим итерацию, текущую сумму и текущую ошибку
disp('Итерация ' + string(n) );
disp('Сумма');
printf("%1.12f", curSum);
disp('Точность');
printf("%1.12f", curErr);
disp("*********")
curErr = abs(curSum - etalonSum);
n = n + 1; //увеличиваем счетчик
end
endfunction
myRange(1e-4, 3/4); // передаём в качестве параметров точность и сумму к которой стремимся
Вычисляем приближённое значение ряда
Комментарии