Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Написать программу вычисления интеграла функции f(x)= (2x + 0,6)*cos(x/2) на отрезке [1,2] по формулам левых, правых и средних прямоугольников, трапеций, Симпсона.

91K
09 июня 2013 года
svetlanamal
1 / / 09.06.2013
Помогите написать программу вычисления интеграла функции f(x)= (2x + 0,6)*cos(x/2) на отрезке [1,2] по формулам левых, правых и средних прямоугольников, трапеций, Симпсона.
  • Что именно у вас не получается? от Der Meister, 09 июня 2013 года
247
09 июня 2013 года
wanja
1.2K / / 03.02.2003
Левых:

 
Код:
h:=(2-1)/n;
sum:=0;
for i:=0 to n-1 do
   begin
   x:=h*i;
   y:=(2*x+0.6)*cos(x/2);
   sum:=sum+h*y;
   end;
примерно так...
326
09 июня 2013 года
sadovoya
757 / / 19.11.2005
Для всех, с подобными вопросами -- Коллекция алгоритмов от Johna Smith Это сборник наиболее распространенных алгоритмов на C++. Без особой оптимизации, для курсовых годится.
326
09 июня 2013 года
sadovoya
757 / / 19.11.2005
На Паскале Симпсона можете взять мой. В виде модуля ф-ций с примерами. Думаю, разберетесь, как свою ф-цию передать в метод. Вот исходники:
Прикрепленные файлы:
29 Кб
Загрузок: 703
326
09 июня 2013 года
sadovoya
757 / / 19.11.2005
На базе исходников консольная программа для вашего примера (вариант метода с заданным числом парабол):

Код:
program ConsoleTest;

{$APPTYPE CONSOLE}

uses SysUtils;

type  // процедурный тип для передачи подынтегральной
      // функции в метод
  TFunOfX_Double = procedure(const x: Double; out f: Double);

//вспомогательная ф-ция для Simpson()
function Sum(fun: TFunOfX_Double;
             FromX, dx: Double;
             Num: Integer):Double;
var
   I : Integer;
   f : Double;
begin
   Result := 0;
   for I := 0 to Num do
   begin
     fun(FromX + I*dx, f);
     Result := Result + f;
   end;
end;

//Собственно метод Симпсона:
function Simpson(fun: TFunOfX_Double;
                 x0, xk: Double;
                 ParabolasNum: Integer): Double;
var
   f, dx: Double;
begin
  If ((x0 >= xk) or (ParabolasNum <= 0)) then
    Raise Exception.Create('Simpson ERROR - BAD_ARGUMENTS');
  try
    dx := (xk - x0)/ParabolasNum;
    fun(x0, f);
    Result := f;
    fun(xk, f);
    Result := (dx/6.0)*(2.0*Sum(fun, x0 + dx, dx, ParabolasNum - 2)
       + 4.0*Sum(fun, x0 + dx/2.0, dx, ParabolasNum - 1)
       + f + Result);
  except
    Raise Exception.Create('Simpson ERROR - INTEGRAT_ERROR');
  end;
end;

//Здесь задаем ф-цию, которую будем интегрировать:
procedure Func(const x: Double; out f: Double);
begin
  f := (2.0*x + 0.6)*cos(x/2.0);
  //f(x)= (2x + 0,6)*cos(x/2)
end;

var
  c: Char;
  Integral: Double;
  x0,xe: Double;
  num: Integer;
begin
  x0:= 1.0; //начало интервала
  xe:= 2.0; //конец интервала
  num:= 1000000; //число парабол
  Integral := Simpson(Func,x0,xe,num);
  writeln('Integral = ', FloatToStr(Integral));
  read(c); //вместо паузы
end.
326
09 июня 2013 года
sadovoya
757 / / 19.11.2005
Пояснение к методу:

Простая формула Симпсона:

I = (x2 - x0)*(f(x0) + 4*f(x1) + f(x2))*(1/6)

где: x0 - начальная точка интервала
x2 - конец интервала
x1 - середина интервала
I - приближенное значение интеграла функции f на интервале [x0; x2]
(I - точное значение интеграла для полиномов 0 - 3 степени)
При суммировании по отрезкам, каждый из которых представлен тремя точками,
через которые проведена парабола, удобна запись:

I = (h/6)*(f_нач. + f_кон. + 4*Sum_сред. + 2*Sum)

где: h - шаг параболы (содержит все 3 точки одной параболы)
f_нач. и f_кон. - значения функции в начальной и конечной точках
всего интервала интегрирования
Sum_сред. - сумма значений функции в центрах парабол
Sum - сумма значений функции в крайних точках парабол (кроме f_нач. и f_кон.)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог