Написать программу вычисления интеграла функции f(x)= (2x + 0,6)*cos(x/2) на отрезке [1,2] по формулам левых, правых и средних прямоугольников, трапеций, Симпсона.
Помогите написать программу вычисления интеграла функции f(x)= (2x + 0,6)*cos(x/2) на отрезке [1,2] по формулам левых, правых и средних прямоугольников, трапеций, Симпсона.
- Что именно у вас не получается? от Der Meister, 09 июня 2013 года
Код:
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;
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;
Коллекция алгоритмов от Johna Smith Это сборник наиболее распространенных алгоритмов на C++. Без особой оптимизации, для курсовых годится.
Для всех, с подобными вопросами --
На Паскале Симпсона можете взять мой. В виде модуля ф-ций с примерами. Думаю, разберетесь, как свою ф-цию передать в метод. Вот исходники:
Код:
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.
{$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.
Простая формула Симпсона:
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_кон.)