2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение25.04.2021, 12:54 


29/05/20
3
Добрый день!

Разбираюсь с заданием - вычислить с помощью квадратурной формулы Гаусса с двумя узлами интеграл Френеля на отрезке от 0 до 1.5 при разных разбиениях этого интервала.

$C(x) = \int_0^{x}{\cos (\frac{\pi t^2}{2})dt}$ - этот интеграл при х=1.5 я также считаю с помощью разложения в ряд Тейлора

Я задаю программе количество разбиений N, строю разбиение отрезка [0,1.5] на N частей - это Z-массив.

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

$\int_c^{d}{\varphi(t)dt}= \sum_{i=1}^{N}{\int_{z_{i-1}}^{z_i}{\varphi(t)dt}}\approx \sum_{i=1}^{N}{S_i(\varphi)}$

где $S_i(\varphi) = \frac{h_N}{2}[\varphi(z_{i-1}+\frac{h_N}{2}(1-\frac{1}{\sqrt{3}}))+\varphi(z_{i-1}+\frac{h_N}{2}(1+\frac{1}{\sqrt{3}}))]$

В ходе расчетов я анализирую модуль расхождения значений интеграла, посчитанного с помощью ряда Тейлора и с помощью квадратурной формулы.

$\left | C(x)- \sum_{i=1}^{N}{S_i(\varphi)} \right |$

Преподаватель как-то сказал, для квадратуры Гаусса c 2 узлами для разных разбиений N справедливо $\frac{\left | C(x)- \sum_{i=1}^{N}{S_i(\varphi)} \right |}{{h_N}^{4}} = \operatorname{const}$

Это своеобразная проверка программы на вшивость. К сожалению, не могу найти этому подтверждение. И долго пытаюсь понять, где в ходе рассчетов я поступаю неправильно? Поскольку $\frac{\left | C(x)- \sum_{i=1}^{N}{S_i(\varphi)} \right |}{{h_N}^{4}} $ принимает разные значения

Например
Код:
-------------
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("-------------");
           
           
           
        }
    }
}



И вообще корректна ли "проверка" программы с помощью отслеживания константности расхождения, деленного на шаг в четвертой степени в данном случае?

Спасибо заранее всем за любые адекватные идеи.

 Профиль  
                  
 
 Re: Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение25.04.2021, 15:47 
Заслуженный участник
Аватара пользователя


23/08/07
5501
Нов-ск
Цитата:
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)))));


Уберите подпрограмму с сеткой, массив для сетки, величины сделайте 8 байтовыми и замените кусок на
Код:
  for (int i=0; i<N; i++)
            {
                      z0=h*(i+1./2);   dd=h/(2*Math.Sqrt(3.))
              S_i = h / 2 * (Program.Cos_count(z0-dd)+ Program.Cos_count(z0+dd));

 Профиль  
                  
 
 Re: Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение25.04.2021, 18:11 


29/05/20
3
TOTAL
Спасибо большое за предложенные исправления, расхождение стало гораздо меньше (~ до 9 знака совпадают). Но, к сожалению, константности расхождения, деленного на четвертую степень шага разбиения, по-прежнему нет, не подскажете в какую сторону копать по этому вопросу?

Прим. для тех же N, что и в первом сообщении, получается следующее:
Код:
x=1,5
N=16
Гаусс = 0,445261146183047
Интеграл = 0,445261174682689
Разница = 2,84996415911287E-08
Разница/h^4 = 0,0003689387676674
---------

x=1,5
N=32
Гаусс = 0,44526117474882
Интеграл = 0,445261174682689
Разница = 6,6131045084461E-11
Разница/h^4 = 1,36974670084906E-05
-----------

x=1,5
N=100
Гаусс = 0,445261176028063
Интеграл = 0,445261174682689
Разница = 1,34537442297855E-09
Разница/h^4 = 0,0265752972440208
-------------

 Профиль  
                  
 
 Re: Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение26.04.2021, 06:32 
Заслуженный участник
Аватара пользователя


23/08/07
5501
Нов-ск
aristarty в сообщении #1515626 писал(а):
TOTAL
Спасибо большое за предложенные исправления, расхождение стало гораздо меньше (~ до 9 знака совпадают). Но, к сожалению, константности расхождения, деленного на четвертую степень шага разбиения, по-прежнему нет, не подскажете в какую сторону копать по этому вопросу?

Стремление к константе при увеличении числа разбиений наблюдалось бы, если бы вычисления были точными, а не машинными. Поэтому делайте расчеты при маленьких $N=5,10,15,20,25,30$. То есть когда погрешность квадратурной формулы больше погрешности машинных вычислений.

 Профиль  
                  
 
 Re: Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение28.04.2021, 11:33 
Заслуженный участник


11/05/08
32166
TOTAL в сообщении #1515673 писал(а):
То есть когда погрешность квадратурной формулы больше погрешности машинных вычислений.

При $n=100$ за счёт округлений мы теряем, грубо говоря, один десятичный порядок, что на фоне наблюдаемой нерегулярности совершенно несущественно.

 Профиль  
                  
 
 Re: Вычисление интеграла составной квадратурой Гаусса с 2 узлами
Сообщение29.04.2021, 08:06 


29/05/20
3
Я считаю значение функции по ряду Тейлора с точностью 1е-6, уменьшение точности до 1е-16 позволило избежать проблем. Спасибо всем за ответы!

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

Модераторы: Модераторы Математики, Супермодераторы



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

Сейчас этот форум просматривают: mihaild


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group