Вычислительная математика
Вариант – по последней цифре в номере зачетной книжки
Решить следующие уравнения методом Ньютона с точностью до 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 с.