Численное интегрирование.




Вычислительная математика

Вариант – по последней цифре в номере зачетной книжки

Решить следующие уравнения методом Ньютона с точностью до 0.01

В0

В1

В2

В3

В4

В5

В6

В7

В8

В9

 

Составить интерполяционный многочлен Лагранжа для функции, заданной таблицей. Найти приближенное значение функции в точке x0

В0

x          
y          

x0 = 1.5

В1

x          
y          

x0 = 5

В2

x        
y        

x0 = 2.5

В3

x        
y -7      

x0 = 1.5

В4

x        
y        

x0 = 7.0

В5

x              
y              

x0 = 1.5

В6

x 2.0 2.1 2.2 2.3 2.4 2.5
y 0.30103 0.32222 0.34242 0.36173 0.38021 0.39794

x0 = 2.03

В7

x 4.0 5.0 6.0 7.0 8.0 9.0 10.0
y 0.60206 0.69897 0.77815 0.84510 0.90309 0.95424 1.0

x0 = 6.5

В8

x 5.0 6.0 7.0 8.0
y 25.0 36.0 49.0 64.0

x0 = 6.25

В9

x          
y          

x0 = 2.5


 

3. Численно взять интегралы, использовать методы прямоугольников, трапеций, Симпсона. Интервал интегрирования необходимо разбить на n=10 частей. Оценить погрешность по методу удвоения шага

В0 а) ; б) ;

В1 а) ; б) ;

B2 а) ; б) ;

В3 а) ; б) ;

В4 а) ; б) ;

В5 а) ; б) ;

В6 а) ; б) ;

В7 а) ; б) ;

В8 а) ; б) ;

В9 а) ; б) .

 

Примеры

Приближенное решение алгебраических уравнений

Пример решения на C++

#include <iostream>

#include <cmath>

using namespace std;

 

int mas_index[20];

double mas_root[20];

 

double f(double x)

{

return pow(x,3)-3*x-1;

}

 

double f1(double x)

{

return 3*pow(x,2)-3;

}

 

double NewtonIteration(double x_old)

{

return x_old - f(x_old)/f1(x_old);

}

 

double NewtonAB(double a, double b, double delta)

{

double x_old = (a+b)/2;

double x_new = NewtonIteration(x_old);

while(abs(x_new-x_old)>delta)

{

x_old = x_new;

x_new = NewtonIteration(x_old);

}

return x_new;

}

 

int apply_Newton(double a, double b, int num_step, double eps)

{

double x_current; // текущее значение х

double step = (b-a)/num_step; // шаг разбиения

int num_root = 0; // количество корней уравнения

for(int i=0; i<num_step-1; i++)

{

x_current = a + i*step; // вычисляем очередное значение х

// если на промежутке (x_current, x_current+step)

// функция меняет знак, то на этом промежутке есть корень

if(f(x_current)*f(x_current+step)<0)

{

mas_index[num_root] = i; // помещаем индекс промежутка в массив индексов

num_root += 1; // наращиваем счетчик индексов

}

}

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

{

x_current = a + mas_index[i]*step;

mas_root[i]=NewtonAB(x_current, x_current+step, eps);

}

 

return num_root;

}

 

int main(void)

{

int temp;// для задержки клавиатуры

double eps = 0.001;

 

for(int i=0; i<20; i++) // обнуляем массив индексов корней

mas_index[i]=0;

 

double a = -2.0; double b = 3.0;// начало и конец промежутка

int num_step = 100; // количество разбиений

 

int num_root = apply_Newton(a, b, num_step, eps);

 

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

{

cout<<mas_root[i]<<endl;

}

 

//cout<<NewtonAB(-1.7,-1.4,0.01)<<endl;

cin>>temp;

}

Численное решение уравнений в Wolfram Mathematica

Интерполирование функций. Многочлен Лагранжа.

Численное интегрирование.

Необходимо прочитать п. 1 Численное интегрирование из книги Зельдовича и Мышкиса [1], разобраться с методом Симпсона и методом трапеций. Также необходимо прочитать и проделать по книге Данко, Попов, Кожевникова [2] из гл. 9 Методы вычислений, параграф 3 приближенное вычисление определенных интегралов номера 1202 – 1205.

 

Кроме того, необходимо написать программу (по примеру, приведенному в листинге 1) для вычисления интегралов, указанных в задании, на языке C++. Для справки и первоначального изучения языка можно воспользоваться материалами https://cppstudio.com/cat/271/.

Пример 1. Численное интегрирование без использования массивов

#include <iostream>

#include <math.h>

using namespace std;

 

double funk(double x)

{

return exp(-sqrt(1+pow(x,2)))+0.1*sin(10*x)+0.2;

}

 

double simpson(double a, double b, int n)

{

double h = (b-a)/n;

double x0, x1, x2;

double sum = 0;

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

{

x0=a+i*h;

x1=x0+h;

x2=x0+2*h;

sum += funk(x0) + 4*funk(x1) + funk(x2);

}

sum *= h/3.0;

return sum;

}

 

double trapezoidal(double a, double b, int n)

{

double h = (b-a)/n;

double x0, x1;

double sum = 0;

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

{

x0=a+i*h;

x1=x0+h;

sum += funk(x0) + funk(x1);

}

sum *= h/2.0;

return sum;

}

 

double rectangle(double a, double b, int n)

{

double h = (b-a)/n;

double x0;

double sum = 0;

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

{

x0=a+i*h;

sum += funk(x0);

}

sum *= h;

return sum;

}

int main(void)

{

int a;

cout<<funk(0.6)<<endl;

cout<<simpson(0.0, 10.0, 120)<<endl;

cout<<trapezoidal(0.0, 10.0, 480)<<endl;

cout<<rectangle(0.0, 10.0, 500000)<<endl;

cin>>a;

return 0;

}

Пример 2. Численное интегрирование (с использованием массивов)

#include <iostream>

#include <fstream>

#include <math.h>

#include <malloc.h>

 

using namespace std;

 

double func(double x)

{

return log(1+x)/(1+pow(x,2));

}

 

double trapezoidal_integration(double a, double b, int n)

{

double sum = (func(a) + func(b))/2.0;

double x;

double step = (b-a)/n;

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

{

x = a + i * step;

sum = sum + func(x);

}

sum = sum * step;

return sum;

}

 

double simpson(double a, double b, int n)

{

double sum = 0;

double x0, x1, x2;

double step = (b-a)/n;

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

{

x0 = a + i * step;

x1 = x0 + step;

x2 = x0 + 2*step;

sum = sum + func(x0) + 4*func(x1) + func(x2);

}

sum = sum * step/3.0;

return sum;

}

 

void simpson_v2(double a, double b, int n, double &res)

{

double sum = 0;

double x0, x1, x2;

double step = (b-a)/n;

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

{

x0 = a + i * step;

x1 = x0 + step;

x2 = x0 + 2*step;

sum = sum + func(x0) + 4*func(x1) + func(x2);

}

sum = sum * step/3.0;

res = sum;

}

 

double simpson_mas(double a, double b, int n, double* mas_y)

{

double sum = 0;

double step = (b-a)/n;

for(int i = 1; i <= n-1; i+=2)

sum = sum + mas_y[i-1] + 4*mas_y[i] + mas_y[i+1];

sum = sum * step/3.0;

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

mas_y[i] = 2.0 * mas_y[i];

return sum;

}

 

 

int main(void)

{

double a = 0.0;

double b = 1.0;

int n = 20;

double step = (b-a)/n;

 

// в стиле С++

double *mas_int = new double[n+1]; // выделили память под массив

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

mas_int[i] = func(a+i*step); // заполнили массив

 

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

{

cout << a+i*step << "\t" << mas_int[i] << endl; // выводим массив

}

cout << endl;

delete[] mas_int; // освободить память

 

// в стиле С

double *mas_malloc = (double*)malloc((n + 1) * sizeof(double));

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

mas_malloc[i] = func(a+i*step); // заполнили массив

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

cout << a+i*step << "\t" << mas_malloc[i] << endl; // выводим массив

//free(mas_malloc); // освободить память

 

cout << endl;

cout << simpson_mas(a, b, n, mas_malloc) << endl;

cout << endl;

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

cout << a+i*step << "\t" << mas_malloc[i] << endl; // выводим массив

 

ofstream my_file; // создали поток вывода в файл

my_file.open("first.txt"); // открыли файл

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

my_file << a+i*step << "\t" << mas_malloc[i] << endl;

my_file.close(); // закрыли файл

 

 

//cout << trapezoidal_integration(0.0, 1.0, 400) << endl;

cout << simpson(0.0, 1.0, 20) << endl;

 

cout << endl;

double res_v2 = 0;

simpson_v2(0.0, 1.0, 20, res_v2);

cout << res_v2;

cin >> a;

}

 

1. Зельдович Я.Б., Мышкис А.Д. Элементы прикладной математики. – М.: 1965. – 616 с.

2. Данко П.Е., Попов А.Г., Кожевникова Т.Я. Высшая математика в упражнениях и задачах: Учеб. пособие для студентов втузов. В 2-х частях. Ч. II. – 4-е изд., испр. и доп. – М.: Высш. шк., 1986. – 415 с.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: