Численное интегрирование - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте уважаемые программеры! С языком СИ я лично познакомился только сегодня, и поэтому понимаю пока не очень хорошо ) есть выражение нужна ваша помощь в написании программы в VisialStudio (ver. от 6 до 10) решить это уравнение и построить график честно говоря сам без понятия как это делать, вот сижу читаю умные книжки по СИ. Пока читаю о вводе переменных =) если не очень заняты и можете помочь, буду вам очень признателен.

Решение задачи: «Численное интегрирование»

textual
Листинг программы
#include <iostream>
#include <cmath>
#include <windows.h>
 
//Пределы интегрирования
const double a = 0;
const double b = 1;
//Точность интегрирования
const double e = 0.0005;
//Множитель аргумента подинтегральной функции
const double k = 10;
 
//Знак-множитель аргумента подинтегральной функции
enum sign
{
    plus = 1,
    minus = -1
};
 
//Подинтегральная функция
long double f(long double x, sign sn)
{
    return exp(sn*k*x);
}
 
//Вычисление приближенного значения интеграла на отрезке [x, x+step]
long double q(long double x, long double step, sign sn)
{
    return (step/2.0*(f(x, sn)+f((x+step), sn)));
}
 
//Вычисление приближенного значения интеграла на отрезке [a, b]
void CalcInt(sign sn)
{
    long double h=0.1;      //Первоначальный шаг
    long double h1=h/2.0;   //Вдвое меньший шаг
    long double Q=0;        //Искомое значение интеграла
    long double x=a;        //Текущий узел сетки
    long double Q1, Q2;     //Значения интеграла, вычисленного на текущем
                            //отрезке с шагом h и h1, соответственно
    long double LExp, RExp; //Левая и правая части условия проверки
                            //точности решения и оптимальности шага
    size_t cnt=0;           //Число операций суммирования
    while(true)
    {
        while((x+h)<b)      //Пока не достигли правого конца интервала
        {
            //Вычисляем приближенные значения интеграла на текущем отрезке
            Q1=q(x, h, sn);                 //С шагом h
            Q2=q(x, h1, sn)+q(x+h1, h1, sn);//С шагом h1
            LExp=fabs(Q1-Q2)/3.0;
            RExp=h*e/(b-a);
            //Проверяем, можно ли увеличить шаг
            if(10*LExp<=RExp)
            {
                //Увеличиваем шаг вдвое
                x+=h;
                h1=h;
                h*=2;
                Q+=Q2;
                ++cnt;
            }
            //Сохраняется ли необходимая точность
            else if(LExp<=RExp)
            {
                //Уменьшаем шаг вдвое
                x+=h;
                h=h1;
                h1/=2.0;
                Q+=Q2;
                ++cnt;
            }
            else
            {
                //Уменьшаем шаг вдвое
                h=h1;
                h1/=2.0;
            }
        }
        //Вычисляем значение интеграла на последнем отрезке
        h=b-x;
        h1=h/2.0;
        Q1=q(x, h, sn);
        Q2=q(x, h1, sn)+q(x+h1, h1, sn);
        //Проверяем, удастся ли сохранить точность на последнем отрезке
        if(fabs(Q1-Q2)/3.0<=h*e/(b-a))
        {
            //Если да, то суммируем значение последнего отрезка
            Q+=Q2;
            ++cnt;
            //...и выходим из цикла
            break;
        }
        else
        {
            //Иначе -  уменьшаем шаг вдвое
            h=h1;
            h1/=2.0;
        }
    }
    //Вывод полученных результатов
    std::cout << "Приближенное значение интеграла функции exp("
        << (sn*k) << "x) на отрезке [" << a << "; " << b << "]"
        << "\n\tравно " << Q << ". Число операций суммирования равно "
        << cnt << std::endl << std::endl;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    CalcInt(plus);
    CalcInt(minus);
    system("pause");
    return EXIT_SUCCESS;
}

Объяснение кода листинга программы

  1. Объявлены константы пределов интегрирования a и b, точности интегрирования e и множителя аргумента подынтегральной функции k.
  2. Объявлена функция f(x, sn), которая представляет собой подынтегральную функцию.
  3. Объявлена функция q(x, step, sn), которая вычисляет приближенное значение интеграла на отрезке [x, x+step].
  4. В функции CalcInt(sn) вычисляется приближенное значение интеграла на отрезке [a, b] с помощью функции q(x, step, sn).
  5. В функции CalcInt(sn) используется цикл while(true), который выполняется до тех пор, пока не будет достигнута правая граница интервала [a, b].
  6. Внутри цикла while(true) выполняется проверка точности вычислений. Если точность вычислений удовлетворяет условию, то шаг интегрирования удваивается, иначе - уменьшается вдвое.
  7. После выхода из цикла while(true) вычисляется значение интеграла на последнем отрезке и проверяется его точность.
  8. Если точность вычислений удовлетворяет условию, то значение интеграла добавляется к общему результату, иначе - шаг интегрирования уменьшается вдвое.
  9. В конце программы вызывается функция CalcInt(plus), которая вычисляет приближенное значение интеграла для положительного знака аргумента, и функция CalcInt(minus), которая вычисляет приближенное значение интеграла для отрицательного знака аргумента.
  10. В конце программы вызывается функция system(pause), которая приостанавливает выполнение программы до нажатия клавиши.
  11. В конце программы возвращается код завершения EXIT_SUCCESS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы