Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

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


Текущее время: 21 сен 2019, 20:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 17 дек 2009, 18:42 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Код:
function [S,varargout] = example2(f,a,b,varargin)
% Функция вычисления интеграла методом Симпсона.
% Разработана в учебных целях.
%
%   [S]   = example2(func, a, b)
%   [S]   = example2(func, a, b, N)
%   [S]   = example2(func, a, b, eps)
%   [S N] = example2(func, a, b, eps)
%
% где
% S    - значение интеграла
% fnnc - функциональная зависимость
% a    - нижний предел интегрирования
% b    - верхний предел интегрирования
% N    - число разбиений интервала
% eps  - точность вычислений
%

% Проверка входных данных встроенными средствами (не менее 3 и не более 4)
error(nargchk(3, 4, nargin));
% Проверка выходных данных  встроенными средствами (не менее 1 и не более 2)
error(nargchk(1, 2, nargout));

% Формула Симпсона
simpson = @(y,dx) dx / 3 * (y(1) + y(end) + 4 * sum(y(2:2:end-1)) + 2 * sum(y(3:2:end-1)));

% Начальные значения переменных
N = 10;
eps = [];

% Вычисление числа дополнительных входных параметров
optarg = nargin - 3;

% Основная логика использования дополнительных параметров
if optarg == 1
    % если есть дополнительный параметр, то проверяется его значение,
    % которое не должно быть отрицательным
    if  varargin{1} <= 0       
        error('Дополнительный параметр должен быть положительным числом.');
    end
    % если параметр меньше единицы, то он является значением точностью
    % вычисления интеграла
   if varargin{1} < 1
      eps = varargin{1};
    else
        % в противном случае параметр должен быть целым
      if round(varargin{1}) == varargin{1}
            % если параметр - целое число, то проверяем его на чётность
         N = varargin{1};
         if mod(N,2)
            N = N + 1;
                % выдаётся предупреждение об изменении числа разбиений
                warning('Число разбиений интервала автоматически увеличено на единицу.');
         end
        else
            % если параметр - нецелое число, то выходим с ошибкой
            error('Неверно указано число разбиений. Этот параметр должен быть целым числом.');
      end
   end
elseif optarg == 0
    % нет дополнительных параметров, используем параметры по умолчанию
   N = 10;
   eps = 1e-3;   
end


% вычисление шага интегрирования и диапазона интегрирования
delta_x = (b - a) / N;
x = a:delta_x:b;
% вычисление интеграла
S = simpson(f(x),delta_x);

% если есть значение точночти вычислений, то считать нужно в цикле до достижения
% указанной точности
if ~isempty(eps)
   eps_current = 2 * eps;
   while eps_current > eps
      N = N * 2;
      S_old = S;
      delta_x = (b - a) / N;
      x = a:delta_x:b;
      S = simpson(f(x),delta_x);
      eps_current = abs((S-S_old)/S);
   end
end

if nargout == 2
   varargout{1} = N;
end



Я постарался прокомментировать каждую строку кода, но если есть вопросы - милости просим! :hi:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB