Методы вычислений


Задание 1

Разработать программу, которая на отрезке [-1,1] по формуле функции f(x) строит интерполяционную таблицу размерности n +1 с неравномерным шагом так, чтобы узлы интерполяции совпадали с нулями полинома Чебышева Tn(x) степени n +1, и интерполяционный полином Лагранжа.

Для контроля распечатать интерполяционную таблицу и значения интерполяционного полинома в узлах сетки.

Вычислить и выдать на печать значение интерполяционного полинома и значение функции f(x) при х = 0,1.

Код программы

// Подключаемые библиотеки

#include <iostream>

#include <conio. h>

#include <stdio. h>

#include <math. h>

#include < windows. h>

// заданная функции

Float f (float x)

{

Return (exp(x) - 3*x + 1);

}

// значение построенного интерполяционного полинома в форме Лагранжа

Float g (float X, float *x, float n)

{

Double p, s=0;

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

{

P = 1;

For (int j=0; j<=n; j++)

{

If (i==j) continue;

P *= (X-x[j])/(x[i]-x[j]);

}

S += p*f(x[i]);

}

Return s;

}

// Построение по формуле функции f(x) интерполяционной таблицы размерности n+1(узлы интерполяции совпадают с нулями полинома Чебышева)

// Массив x - узлы интерполяции (нули полинома Чебышева),

// Массив y - значения функции f(x) в узлах сетки.

// Массив z - значения интерполяционного полинома

Void xyz (float n, float *x, float *y, float *z)

{

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

{

X[i] = - cos(3.14159*(2*i+1)/(2*(n+1)));

Y[i] = f(x[i]);

}

For (int i=0; i<=n; i++) z[i] = g(x[i],x, n);

Printf (" x y(x) g(x) ");

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

{

If (i==18) // при заполнении страницы ждем нажатия клавиши

{

Printf ("Для продолжения нажмите любую клавишу... ");

_getch ();

Printf (" x y(x) g(x) ");

}

Printf (" % .3f%12f%12f ", x[i], y[i], z[i]);

}

}

Void main (void)

{

Setlocale(LC_ALL, "Russian"); //Для ввода русских символов

Float n = 25, *x, *y, *z;

// динамически создаем массивы из n+1 элементов

X = new float[n+1];

Y = new float[n+1];

Z = new float[n+1];

Printf ("Интерполяционная таблица (n=25) ");

Xyz (n, x, y, z);

Printf (" Значение функции при x = 0.1: %f", f(0.1));

Printf (" Значение интерполяционного полинома при x =0.1:%f ",g(0.1, x, n));

// освобождаем память, выделенную под массивы

Delete x; delete y; delete z;

System("pause"); // Для ожидания прекращения работы

}

Результат работы программы

Рис. 1

Задание 2

Интеграл размерность полином чебышев

Построить алгоритм для вычисления приближенного значения интеграла по формуле Симпсона при n = 8 иn = 16, где n - это число интервалов, и оценки погрешности по правилу Рунге. Разработать программу, которая реализует этот алгоритм. На печать выдать два приближенных значения интеграла (при n = 8 и n = 16) и погрешность, найденную по правилу Рунге.

Код программы

//Подключаемые библиотеки

#include <conio. h>

#include <stdio. h>

#include <math. h>

#include <windows. h>

#include <iostream>

// Заданная функция

Float f1 (float x) {return 1/sqrt(2*x*x + 1.3);}

Void main(void)

{

Setlocale(LC_ALL, "Russian"); //Для ввода русских символов

/* a и b - границы отрезка

N - число отрезков

H - шаг

Q1 - значение интеграла при n=8

Q2 - значение интеграла при n=16

*/

Float a, b, h, Q1,Q2,Q; int n, i; // объявили переменные

Printf(" Численное интегрирование функций");

Puts(" *** Формула Симпсона ***");

A = 1; b = 2.8;

N = 8; h = (b-a)/n;

Q1 = f1(a)+f1(b);

Float s1=0, s2=0, x=a;

For (i=1; i<n; i++)

{

X += h;

If (i%2)

// сумма значений функции в точках с нечетными номерами

S1 += f1(x);

Else

// сумма значений функции в точках с четными номерами

S2 += f1(x);

}

Q1 = h/3*(Q1+4*s1+2*s2);

Printf (" n= 8:");

Printf (" Приближенное значение интеграла: %.7f", Q1);

N = 16;

H = (b-a)/n;

Q2 = f1(a)+f1(b);

S1=0; s2=0; x=a;

For ( i=1; i<n; i++)

{

X += h;

If (i%2)

// сумма значений функции в точках с нечетными номерами

S1 += f1(x);

Else

// сумма значений функции в точках с четными номерами

S2 += f1(x);

}

Q2 = h/3*(Q2+4*s1+2*s2);

Printf (" n= 16:");

Printf (" Приближенное значение интеграла: %.7f ", Q2);

Q= fabs(Q1-Q2)/15;

Printf(" Оценка погрешности по правилу Рунге: R=%.2e ",Q);

System("pause"); // Для ожидания прекращения работы

}

Результат работы программы

Рис. 2

Задание 3

Построить алгоритм для приближенного решения задачи Коши для обыкновенного дифференциального уравнения с начальным условием, на отрезке [0,1], с шагом h = 0.1 методом Рунге-Кутта четвертого порядка. Разработать программу, которая реализует этот алгоритм и выдает на печать таблицу приближенных и точных значений решения.

Код программы

//Подключаемые библиотеки

#include <conio. h>

#include <math. h>

#include <stdio. h>

#include <windows. h>

#include <iostream>

/* Глобальные переменные и массивы:

N - число узлов сетки

X[n] - массив узлов сетки

Y[n] - массив значений точного решения

U[n] - массив значений приближенного решения

H - шаг сетки

M, k - параметры, входящие в формулу точного решения

K1,K2,K3,K4 - коэффициенты метода Рунге-Кутта

*/

Const int n = 11;

Double x[n], y[n], u[n], h = 0.1,

M = 1.1, k = 2.5, K1, K2, K3, K4;

// возвращает значение функции (правой части ДУ)

Double f (double x, double y) { return - m*y+exp(k*x); }

Void main (void)

{

Setlocale(LC_ALL, "Russian"); //Для ввода русских символов

Printf("Численное решение задачи Коши для обыкновенных дифференциальных уравнений первого порядка");

// Метод Рунге-Кутта четвертого порядка

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

{

Double a = i*h; x[i] = a;

// формула точного решения

Y[i] = (exp((k+m)*a)/(k+m)+1-1/(k+m))/exp(m*a);

}

U[0] = 1;

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

{

K1=f(x[i], u[i]);

K2=f(x[i]+h/2, u[i]+h/2*K1);

K3=f(x[i]+h/2, u[i]+h/2*K2);

K4=f(x[i]+h, u[i]+h*K3);

// вычисление приближенного решения

U[i+1] = u[i]+h/6*(K1+2*K2+2*K3+K4);

}

// Вывод результатов на экран

Printf ("n Результаты расчета: ");

Printf (" Узлы сетки Точное решение Приближенное решение ");

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

{

Printf (" %10.2f % -14.4f % -20.4f ", x[i], y[i], u[i]);

}

Printf(" ");

System("paus

Результат работы программы

Рис. 3

Список использованных источников

    1. Бахвалов Н. С. Численные методы / Н. С. Бахвалов, Н. П. Жидков, Г. М. Кобельков. - М.: Наука, 1987. - 600с. 2. Боглаев Ю. П. Вычислительная математика и программирование / Ю. П. Боглаев. - М.: Высшая школа, 1990.-544с. 3. Жидков Е. Н. Вычислительная математика / Е. Н. Жидков. - М.: Академия, 2010.- 208с.

Похожие статьи




Методы вычислений

Предыдущая | Следующая