Равномерное разбиение интервала интегрирования. Вычисление интеграла с помощью квадратурной формулы Гаусса, страница 2

return 3*cos(arg/2)*exp(arg/4) + 5*sin(2.5*arg)*exp(-arg/3) + 2*arg;

}

double p(double arg)

{

return pow(arg-a,-alpha)*pow(b-arg,-beta);

}

double find_mu(int deg, double a, double b)//нахождение mu

{

if(a)

if(deg) return (pow(b,deg)*pow(b-::a,1-alpha)-pow(a,deg)*pow(a-::a,1-alpha))/(1+deg-alpha)+::a*deg/(1+deg-alpha)*find_mu(deg-1,a,b);

else return (pow(b-::a,1-alpha)-pow(a-::a,1-alpha))/(1-alpha);

else

if(deg) return (pow(a,deg)*pow(::b-a,1-beta)-pow(b,deg)*pow(::b-b,1-beta))/(1+deg-beta)+::b*deg/(1+deg-beta)*find_mu(deg-1,a,b);

else return (pow(::b-a,1-beta)-pow(::b-b,1-beta))/(1-beta);

}

void init_param(double a, double b)//разбиение на отрезки

{

for(int i = 0; i < n; i++)

node_x[i] = a + i*(b-a)/(n-1);

for(int i = 0; i < n; i++)

for(int j = 0; j < n; j++)

arr_x[i][j] = pow(node_x[j],i);

for(unsigned int i = 0; i < n; i++)

mu[i] = find_mu(i, a, b);

}

void gauss() // считаем коэф. Кв. Формулы методом Гаусса

{

for(int i = 0; i < n; i++)

for(int j = i+1; j < n; j++)

{

double koef = arr_x[j][i]/arr_x[i][i];

for(int k = i; k < n+1; k++)

arr_x[j][k] -= arr_x[i][k]*koef;

mu[j] -= mu[i]*koef;

}

A_koefs[n-1] = mu[n-1]/arr_x[n-1][n-1];

for(int i = n-2; i >= 0; i--)

{

double temp = 0;

for(int j = n-1; j > i; j--)

temp += arr_x[i][j]*A_koefs[j];

A_koefs[i] = (mu[i] - temp)/arr_x[i][i];

}

}

double simple_nk(double a, double b)//подсчет интеграла на каждом из отрезков

{

cout<<"Simple Newton Kotes start"<<endl;

double result = 0;

init_param(a,b);

gauss();

cout<<"Interval of integration: ["<<a<<"; "<<b<<"]"<<endl;

cout<<"Number of points: "<<n<<endl;

for(int i = 0; i < n; i++)

cout<<"A["<<i+1<<"] = "<<A_koefs[i]<<endl;

for(int i = 0; i < n; i++)

result += A_koefs[i]*f(node_x[i]);

cout<<"Result: "<<result<<endl;

cout<<"Simple Newton Kotes stop"<<endl;

cout<<endl;

return result;

}

double dif_nk(unsigned int k) //суммирование значений интегралов на отрезках

{

double result = 0;

if(k - 1)

{

cout<<"Composite Newton Kotes start"<<endl;

cout<<"----------------------------"<<endl;

double h = (b - a)/(k-1);

for(double i = a; i + h <= b; i += h)

result += simple_nk(i, i + h);

}

else

{

cout<<"Wrong number of points"<<endl;

exit(1);

}

cout<<"Result: "<<result<<endl;

cout<<"Composite Newton Kotes stop"<<endl;

return result;

}

double find_optim()

{

double S4 = dif_nk(5);

double S8 = dif_nk(9);

double H = (b - a)/4;

double ch = 1 - pow(2.0,-n);

double zn = fabs(S4 - S8);

double k = 1/static_cast<double>(n);

return H*pow(eps*ch/zn,k);

}

--------------------------------------------------------------------------------Simple Newton Kotes start

Interval of integration: [1.7; 3.2]

Number of points: 3

A[1] = 0.250000000000001

A[2] = 0.999999999999998

A[3] = 0.250000000000001

Result: 9.3772655647162

Simple Newton Kotes stop

Input number of nodes for composite method

8

Composite Newton Kotes start

---------------------------Simple Newton Kotes start

Interval of integration: [1.7; 1.91428571428571]

Number of points: 3

A[1] = 0.0357142857142842

A[2] = 0.142857142857146

A[3] = 0.0357142857142844

Result: 0.830415466510424

Simple Newton Kotes stop

Simple Newton Kotes start

Interval of integration: [1.91428571428571; 2.12857142857143]

Number of points: 3

A[1] = 0.0357142857142858

A[2] = 0.142857142857142

A[3] = 0.0357142857142861

Result: 0.922533733328308

Simple Newton Kotes stop

Simple Newton Kotes start

Interval of integration: [2.12857142857143; 2.34285714285714]

Number of points: 3

A[1] = 0.0357142857142838

A[2] = 0.142857142857146

A[3] = 0.0357142857142846

Result: 1.12682318518261

Simple Newton Kotes stop

Simple Newton Kotes start

Interval of integration: [2.34285714285714; 2.55714285714286]

Number of points: 3

A[1] = 0.035714285714292

A[2] = 0.142857142857131

A[3] = 0.0357142857142918

Result: 1.37615893217413

Simple Newton Kotes stop

Simple Newton Kotes start

Interval of integration: [2.55714285714286; 2.77142857142857]

Number of points: 3

A[1] = 0.0357142857142576

A[2] = 0.142857142857199

A[3] = 0.0357142857142583

Result: 1.59627617049209

Simple Newton Kotes stop

Simple Newton Kotes start

Interval of integration: [2.77142857142857; 2.98571428571429]

Number of points: 3

A[1] = 0.0357142857143121

A[2] = 0.142857142857091

A[3] = 0.0357142857143118

Result: 1.7263825325223

Simple Newton Kotes stop

Result: 7.57859002020986

Composite Newton Kotes stop

Для продолжения нажмите любую клавишу . . .

-------------------------------------------------------------------------------Значение при  применении малой трехточечной квадратурной формулы с равностоящими узлами без разбиения дала менее точный результат, чем при разбиении отрезка на части.