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

Рассмотрим простую задачку из матана: как посчитать конечную сумму ряда приближенно в 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); // передаём в качестве параметров точность и сумму к которой стремимся
                                                     
Вычисляем приближённое значение ряда

Комментарии

Гость
Ответить
Войдите, чтобы оставить комментарий.
Гость
Ответить
Гость
Ответить
Гость
Ответить
Еще нет комментариев, оставьте первый.