Добрый день!
Разбираюсь с заданием - вычислить с помощью квадратурной формулы Гаусса с двумя узлами интеграл Френеля на отрезке от 0 до 1.5 при разных разбиениях этого интервала.
- этот интеграл при х=1.5 я также считаю с помощью разложения в ряд Тейлора
Я задаю программе количество разбиений N, строю разбиение отрезка [0,1.5] на N частей - это Z-массив.
Далее вычисляю с помощью составной квадратурной формулы интеграл следующим образом:
где
В ходе расчетов я анализирую модуль расхождения значений интеграла, посчитанного с помощью ряда Тейлора и с помощью квадратурной формулы.
Преподаватель как-то сказал, для квадратуры Гаусса c 2 узлами для разных разбиений N справедливо
Это своеобразная проверка программы на вшивость. К сожалению, не могу найти этому подтверждение. И долго пытаюсь понять, где в ходе рассчетов я поступаю неправильно? Поскольку
принимает разные значения
Например
Код:
-------------
x=1,5
N=16
Гаусс = 0,5368527
Интеграл = 0,4452612
Разница = 0,09159157
Разница/h^4 = 1185,688
------------
x=1,5
N=32
Гаусс = 0,4901777
Интеграл = 0,4452612
Разница = 0,04491657
Разница/h = 9303,396
-------------
x=1,5
N=100
Гаусс = 0,4452625
Интеграл = 0,4452612
Разница = 1,311302E-06
Разница/h = 25,90227
-------------
Код программы прилагаю:
Код:
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void getGrid(float a, float b, float step, ref List<float> X)
{
float x = a;
while (x < b)
{
X.Add(x);
x += step;
}
}
public static float Cos_count(float val)
{
return (float)Math.Cos(Math.PI * val * val / 2); //вычисление подынтегральной функции интеграла Френеля
}
public static float S(int N, float x) { //расчет квадратуры Гаусса
List<float> Z = new List<float>();
float h = x / N;
Program.getGrid(0, x, h, ref Z); //получение разбиения
float valS = 0;
float S_i = 0;
for (int i=1; i<Z.Count(); i++)
{
S_i = (h / 2) * (Program.Cos_count((float)(Z[i-1]+(h/2)*(1-1/Math.Sqrt(3))))+ Program.Cos_count((float)(Z[i - 1] + (h / 2) * (1 + 1 / Math.Sqrt(3)))));
valS += S_i;
}
return valS;
}
public static float Integral_counter(float b, float ep) //расчет интеграла по Тейлору
{
}
public static float GaussCounter (int n, float x){
float eps = 1e-4F;
float S_n = S(n,x);
//float S_2n = S(2 * n,x);
// while (Math.Abs(S_2n - S_n) > eps)
//{
// S_n = S_2n;
// n *= 2;
// S_2n = S( 2 * n,x);
// }
return S_n;
}
public static void Main(string[] args)
{
int n=100;
float x=1.5F;
float step=(1.5F)/n;
Console.WriteLine("-------------");
Console.WriteLine("x="+x);
Console.WriteLine("N="+n);
Console.WriteLine("Гаусс = "+GaussCounter(n,x));
Console.WriteLine("Интеграл = "+Integral_counter(x,1e-6F));
Console.WriteLine("Разница = "+Math.Abs(Integral_counter(x,1e-6F)-GaussCounter(n,x)));
Console.WriteLine("Разница/h = "+Math.Abs(Integral_counter(x,1e-6F)-GaussCounter(n,x))/((x/n)*(x/n)*(x/n)*(x/n)));
Console.WriteLine("-------------");
}
}
}
И вообще корректна ли "проверка" программы с помощью отслеживания константности расхождения, деленного на шаг в четвертой степени в данном случае?
Спасибо заранее всем за любые адекватные идеи.