Назад к материалам

Вычисляем приближённое значение ряда

Подсчёт конечной суммы бесконечного ряда с заданной точностью

Подсчёт конечной суммы бесконечного ряда с заданной точностью

Рассмотрим простую задачку из матана: как посчитать конечную сумму ряда приближенно в scilab, задав предварительно точность для сравнения с аналитическим значением.

Постановка задачи

Вычислить приближенное значение бесконечной суммы с точностью . Сравнить полученный результат c точным значением, равным

Вводим входные параметры

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

/* функция с проверкой точности и допустимого числа итераций */
function myRange(accuracy, etalonSum)    
  /*тело функции*/   
endfunction  
  
myRange(1e-4, 3/4); // передаём в качестве параметров точность и сумму к которой стремимся

Заготовка функции

Задание необходимых параметров в функции

Для подсчета суммы в пользовательской функции нам потребуется:

  • накопитель :
  • текущая ошибка :
  • счетчик итераций
  • и максимальное число суммирований чтобы не упасть в бесконечный цикл :

При этом, функция примет вид:

/* функция с проверкой точности и допустимого числа итераций */
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); // передаём в качестве параметров точность и сумму к которой стремимся
                                                     

Вычисляем приближённое значение ряда