Методы аппроксимации функции
Выбор аппроксимирующих функций в зависимости от условия задачи. Построение графиков функций: исходной, полученных аппроксимирующих и зависимостей погрешностей. Проведение контрольных расчетов с помощью системы Mathcad для всех методов аппроксимации.
Рубрика | Математика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.12.2014 |
Размер файла | 502,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Задание на курсовую работу по теме «Методы аппроксимации функции»
Исходные данные: Таблично заданная функция.
Перечень подлежащих разработке вопросов:
а) Изучить теоретический материал;
б) Аппроксимировать функцию;
в) вывести графики;
г) сравнить результаты работы с результатами системы Mathcad
Аннотация
В работе задана таблично функция, которую нужно аппроксимировать, разработаны программы ее аппроксимации несколькими способами, проведена проверка в системе Mathcad, сделаны выводы по проделанной работе.
Введение
Аппроксимация функций имеет большое практическое значение в современной математике. Связь между величинами может быть точной (функциональной) и менее точной (корреляционной). При ведении научных исследований и обработке экспериментальных данных наиболее часто встречается именно корреляционная связь, что определяет актуальность ее изучения и получения такой связи методом аппроксимации.
При изучении количественных зависимостей различных показателей, значения которых определяются эмпирически, как правило, имеется некоторая их вариабельность. Частично она задается неоднородностью самих изучаемых объектов неживой и, особенно, живой природы, частично обуславливается погрешностью наблюдения и количественной обработке материалов. Последнюю составляющую не всегда удается исключить полностью, можно лишь минимизировать ее тщательным выбором адекватного метода исследования и аккуратностью работы. Поэтому при выполнении любой научно-исследовательской работы возникает проблема выявления подлинного характера зависимости изучаемых показателей, этой или иной степени замаскированных неучтенностью вариабельности значений. Поэтому применяются методы аппроксимации как приближенное описание корреляционной зависимости переменных подходящим уравнением функциональной зависимости, передающим основную тенденцию зависимости (или ее "тренд").
При выборе метода аппроксимации следует исходить из конкретной задачи исследования. Обычно, чем более простое уравнение используется для аппроксимации, тем более приблизительно получаемое описание зависимости. Поэтому важно считывать, насколько существенны и чем обусловлены отклонения конкретных значений от получаемого тренда. При описании зависимости эмпирически определенных значений можно добиться и гораздо большей точности, используя какое-либо более сложное, много параметрическое уравнение. Однако нет никакого смысла стремиться с максимальной точностью передать случайные отклонения величин в конкретных рядах эмпирических данных. Гораздо важнее уловить общую закономерность, которая в данном случае наиболее логично и с приемлемой точностью выражается именно двухпараметрическим уравнением степенной функции.
Целью курсовой работы является закрепление практических навыков самостоятельного решения задач, развитие исследовательских способностей и умение пользоваться нормативной и справочной литературой.
Для достижения данной цели нами поставлены следующие задачи:
Описать теоретические положения, связанные с выбором методов аппроксимации функций.
Создать на языке Си программу решения задачи аппроксимации.
Проверить расчеты в системе Mathcad.
Описать программу и сделать отчет о проделанной работе.
В программе предусмотрено оценивание точности, с которой метод приближает заданную функцию, анализ результатов, выбор наилучшего метода аппроксимации.
1. Постановка задачи
В таблице приведены данные американского Бюро переписи населения, характеризующие численность населения Соединенных Штатов:
Год |
1900 |
1910 |
1920 |
1930 |
1940 |
1950 |
1960 |
1970 |
|
Населе-ние |
75994575 |
91972266 |
105710620 |
122775046 |
131669275 |
150697361 |
179323175 |
203235298 |
Как известно, для этой n=7 таблицы (n=7) существует единственный интерполяционный полином 7-й степени. Рассмотрим четыре представления этого полинома:
,
,
,
В точной арифметике не имеет значения, каким представлением пользоваться, но с вычислительной точки зрения одни предпочтительнее других. Для каждого из этих полиномов запишите матрицу системы для коэффициентов размера 8Ч8 и оцените ее число обусловленности. Интерполируйте данные полиномом, отвечающим наилучшей обусловленности матрицы, а также кубическим сплайном. Постройте графики. Какова будет численность в 1980 году (на самом деле она составила 226547082).
Требуется решить следующие подзадачи.
1 Выбрать аппроксимирующие функции в зависимости от условия задачи, обосновать выбор.
2 Аппроксимировать данные выбранными методами, определить погрешности аппроксимаций.
3 Построить графики функций: исходной, полученных аппроксимирующих и зависимостей погрешностей.
4 Провести анализ полученных результатов и выбрать оптимальную аппроксимирующую функцию.
5 Провести контрольные расчеты с помощью системы Mathcad для всех методов аппроксимации.
6 Построить схемы алгоритмов программы.
7 Оформить отчет.
аппроксимация функция график
2. Теоретическое обоснование решения задачи
2.1 Постановка задачи аппроксимации
Замена одной функции другой более простой и удобной для дальнейшей работы функцией называется аппроксимацией функции, или просто приближением функции.
Чаще всего задача аппроксимации решается с помощью многочленов. Кроме того, для аппроксимации используются ряды Фурье, экспоненциальные, логарифмические, степенные и другие элементарные функции.
Частным случаем аппроксимации является интерполяция.
Функция называется интерполирующей или интерполяционной для на , если ее значения , ,…, в заданных точках , называемых узлами интерполяции, совпадают с заданными значениями функции .
Геометрически факт интерполирования означает, что график функции проходит так, что, по меньшей мере, в заданных точках он пересекает или касается графика функции . Легко представить, что таких графиков множество.
Интерполяционная функция будет единственной для функции, заданной в (n+1) точке, если в качестве выбрать многочлен степени , такой что:
(2.1)
Определение. Многочлен , отвечающий вышеназванным условиям, называется интерполяционным многочленом.
Пусть многочлен представлен в виде
(2.2)
т.е.,
он является линейной комбинацией некоторых базисных функций с коэффициентами с,...,с, которые находятся в зависимости от вида приближения. Многочлен Фm(х) называют обобщенным многочленом по системе функций 0(х), 1(х), … ,m(х), а число m - его степенью.
Для оценки точности приближения функций используют различные критерии согласия, основанные на использовании различных способов введения расстояния между функциями.
(2.3) |
Так, для функций, ограниченных на , можно использовать метрику:
(2.4) |
Для функций непрерывных на , расстояние можно рассчитать по формулам:
, и др. |
(2.5) |
Для функций, заданных таблично можно использовать формулу Чебышева:
. |
(2.6) |
В нашем случае функция задана таблично, поэтому нужно использовать формулу Чебышева.
Часто процедура аппроксимации связана с другим критерием:
, |
(2.7) |
на его основе создан способ аппроксимации, называемый методом наименьших квадратов.
2.2 Оценка числа обусловленностей матрицы
Число обусловленности квадратной матрицы A определяется, как
k(A) = ||A||·||A -1||
Число обусловленности имеет следующее значение: если машинная точность, с которой совершаются все операции с вещественными числами, равна е, то при решении системы линейных уравнений Ax = b результат будет получен с относительной погрешностью порядка е·k(A). Хотя число обусловленности матрицы зависит от выбора нормы, если матрица хорошо обусловлена, то её число обусловленности будет мало при любом выборе нормы, а если она плохо обусловлена, то её число обусловленности будет велико при любом выборе нормы. Таким образом, обычно норму выбирают исходя из соображений удобства. На практике наиболее широко используют 1-норму, 2-норму и ?-норму, задающиеся формулами:
Если матрица A задана непосредственно, алгоритм оценки числа обусловленности имеет вид:
вычисление 1-нормы (или inf-нормы) матрицы A прямым алгоритмом за время O(N 2)
построение треугольной факторизации матрицы A за время O(N 3)
получение нижней границы нормы матрицы A -1, используя итеративный алгоритм с трудоемкостью O(N 2)
получение оценки - произведения двух норм. Общая трудоемкость: O(N 3)
Если матрица A задана своей треугольной факторизацией (LU-разложением или разложением Холецкого), то нам нет необходимости осуществлять шаг (2). Однако на шаге (1) мы уже не можем использовать прямой алгоритм - для него требуется знание матрицы A, а не её факторизации. Поэтому используется следующий алгоритм:
вычисление 1-нормы (или inf-нормы) матрицы A итеративным алгоритмом за время O(N 2)
получение нижней границы нормы матрицы A -1 итеративным алгоритмом за время O(N 2)
получение оценки - произведения двух норм. Общая трудоемкость: O(N 2)
Недостатком итеративного алгоритма является то, что он позволяет получить не само число обусловленности, а лишь его оценку снизу, причем довольно-таки грубую. Обычно оценка меньше самого числа обусловленности лишь на 5-10 процентов, но бывают случаи, когда они отличаются очень значительно (в численных экспериментах оценка в среднем была меньше числа обусловленности на 8%, максимум - на 87%). Обычно когда оценка какой-то величины в десять раз меньше самой величины, эту оценку нельзя назвать точной. Тем не менее, даже такая оценка бывает достаточной.
Рассмотрим конкретный пример. Пусть число обусловленности матрицы A составило 10 4. Это обозначает, что при точности представления вещественных чисел 10 -15 система линейных уравнений будет решена с точностью до 11-ого знака после запятой. Теперь предположим, что наша оценка числа обусловленности крайне неточна - отклоняется на 90% - и равна всего лишь 10 3. Это обозначает, что мы будем ожидать решения системы уравнений с более высокой точностью - до 12-ого знака после запятой. Разница не такая уж и большая, поскольку обычно важен лишь порядок погрешности, а не её точная величина. В среднем же случае 10% разницы составляют менее одного десятичного знака и могут быть проигнорированы.
2.3 Определение сплайна и интерполяция сплайном
Пусть отрезок [a,b] разбит на n равных частей [xi, xi+1], где xi=a+ih, i=0,...,n, xn=b, h=(b-a)/n.
Сплайном называется функция, которая вместе с несколькими производными непрерывна на всем заданном отрезке [a,b], а на каждом частичном отрезке [xi, xi+1] в отдельности является некоторым алгебраическим многочленом.
Максимальная по всем частичным отрезкам степень многочленов называется степенью сплайна, а разность между степенью сплайна и порядком наивысшей непрерывной на [a,b] производной - дефектом сплайна.
Определение. Функция Sn,(x) называется сплайном степени n дефекта (-целое число, 0n+1) с узлами на сетке (: a=x0< <xi<...<xn=b), если:
а) на каждом отрезке [xi,x i+1] функция Sn, (x) является многочленом степени n, то есть для x[xi, xi+1] , i=0,...,n-1;
б) S n,(x)Cn-v[a,b] (для целого k>0 через Ck =Ck[a,b] обозначается множество k раз непрерывно дифференцируемых на [a,b] функций).
На практике широкое распространение получили сплайны третьей степени, имеющие на [a,b] непрерывную, по крайней мере, первую производную. Эти сплайны называются кубическими и обозначаются S3(x) (без указания дефекта).
Пусть на отрезке [a,b] в узлах сетки заданы значения некоторой функции fi =f(xi), i=0,...,n.
Интерполяционным кубическим сплайном S3(x) называется сплайн
S3(x)=аi0 +аi1(x - xi)+аi2(x - xi)2 +аi3(x - xi)3, x[xi, xi+1], (1.1)
удовлетворяющий условиям
S3(xi)=f(xi), i=0,...,n. (1.2)
Сплайн (1.1) на каждом из отрезков [xi, xi+1], i=0,...,n-1 определяется четырьмя коэффициентами, и поэтому для его построения на всем промежутке [a,b] необходимо определить 4n коэффициентов. Для их однозначного определения необходимо задать 4n уравнений.
Условие (1.2) дает 2n уравнений, при этом функция S3(xi), удовлетворяющая этим условиям, будет непрерывна во всех внутренних узлах.
Условие непрерывности производных сплайна , r=1,2 во всех внутренних узлах xi, i=1,...,n-1 сетки дает 2(n-1) равенств.
2.4 Алгоритм построения интерполяционного кубического сплайна
Пусть каждому значению аргумента xi, i=0,...,n соответствуют значения функции f(xi)=yi и требуется найти функциональную зависимость в виде сплайна (1.1), удовлетворяющего перечисленным ниже требованиям:
а) функция S3(xi) непрерывна вместе со своими производными до второго порядка включительно;
б) S3(xi)=yi, i=0,1,...,n;
в) S"3(x0)=S"3(xn)=0.
Сформулированная выше задача имеет единственное решение.
Вторая производная S"3(x) непрерывна и, как видно из выражения (1.1), линейна на каждом отрезке [xi-1, xi], (i=1,...,n), поэтому представим ее в виде
, (1.4)
где hi = xi- xi-1 , mi= S"3(xi).
Интегрируя обе части равенства (1.4), получим
, (1.5)
где Ai и Bi - постоянные интегрирования.
Пусть в (1.5) x=xi и x=xi-1, тогда используя условия б), получим
, i=1,...,n.
Из этих уравнений находим Ai и Bi, и окончательно формула (1.5) принимает вид
. (1.6)
Из формулы (1.6) находим односторонние пределы производной в точках x1,x2 ,...,xn-1:
, (1.7)
. (1.8)
Приравнивая выражения (1.7) и (1.8) для i=1,...,n-1, получим n-1 уравнение
(1.9)
с n-1 неизвестными mi (i=1,...,n-1). Согласно условию (1.4) m0=mn=0.
Система линейных алгебраических уравнений (1.9) имеет трехдиагональную матрицу с диагональным преобладанием. Такие матрицы являются неособенными. Поэтому неизвестные m1 , m2 , ... , mn-1 находятся из системы (1.9) однозначно. После определения mi функция S3(x) восстанавливается по формуле (1.6).
Рассмотрим метод прогонки.
Пусть имеется система уравнений, записанная в матричном виде:
. (1.10)
В нашем случае согласно (1.9)
интерполяция кубический сплайн погрешность
Решение системы ищется в виде
mi = i mi+1 + i , i=1,...,N-1, (1.11)
где Ai , Bi - прогоночные коэффициенты. Используя выражение для m i-1 из (1.11), исключим это неизвестное из i-го уравнения системы. Получаем
(ai +ci i-1)mi + bi mi+1 = di -cii-1.
Сравнивая это соотношение с (1.11), выводим рекуррентные формулы для прогоночных коэффициентов i, i (прямая прогонка):
0=0=0, . (1.12)
Очевидно, что mn-1=n-1 (при сn-1=0). Все остальные неизвестные находим по формулам (1.11), используя выражения для прогоночных коэффициентов (1.12).
Величины i и ai +cii-1 не зависят от правой части системы. Поэтому если вычислить их и запомнить, то для решения систем, отличающихся только правыми частями, потребуется 5(n-1) арифметических операций.
3. Разработка алгоритмов
3.1 Структурная организация данных
Данные в программе в основном представлены как глобальные переменные, так как часть функций вычисляет переменные, а часть занимается их выводом в файл или в графическом виде. Некоторые промежуточные переменные объявлены внутри функций.
Табличная функция представлена массивом:
//описание массива
double fun[2][8] ={
{1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970},
{75994575,91972266,105710620,122775046,131669275,150697361,179323175,203235298}};
Глобальные переменные-счетчики целочисленного типа:
int i=0;
int j=0;
3.2 Спецификация функций
Функции соответствуют заданию к курсовой работе:
OutFun() - выводит табличную функцию на консоль;
RCond() -оценка числа обусловленности;
IPol() -интерполирует полиномом, выбранным в предыдущей функции;
ICubic() - интерполирует кубическим сплайном;
DrawGraph() - рисует графики;
OutputFuncs() -выводит функцию в файл.
3.3 Укрупненная схема алгоритма программного средства
Основной алгоритм программы представляет собой выбор функций из меню и представлен на рис. 1
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Рис. 1. Основной алгоритм программы
3.4 Детальная разработка алгоритмов отдельных подзадач
Рассмотрим детальную разработку алгоритма оценки числа обусловленности матрицы (рис. 2):
Рис. 2. Алгоритм оценки числа обусловленности
Разработка других алгоритмов представлена в приложении А, где имеется код программы с подробными комментариями.
4. Решение задачи
4.1 Результаты работы программы
Основное меню программы представлено на рис. 3.
Рис. 3. Запуск программы
После вывода табличной функции (пункта 2 меню) программа выглядит следующим образом (рис. 4):
Рис. 4. Вывод функции на консоль.
По результатам оценки обусловленности определяет четвертый полином:
Рис. 5. Оценка обусловленности
Интерполяция определяет численность в 1980 году:
Рис. 6. Интерполяция полиномом.
По результатам интерполяции сплайном выдает таблицу сплайна:
Рис. 7. Интерполяция сплайном
Так как в задании значения по Х сильно отличаются от значений по Y, невозможно выбрать масштаб, чтобы график адекватно вписался в количество пикселей на экране, однако в программе имеются функции, которые выводили бы графики, если бы цифры вписывались в экран.
По результатам вывода в файл выдается сообщение о том, что файл успешно создан:
Рис. 8. Программа после вывода в файл.
Заключение
Таким образом, в работе были описаны теоретические положения, связанные с выбором методов аппроксимации функций, создана программа на языке Windows С++ (консольное приложение с исмользованием некоторых функций Win API). Программа демонстрирует решение задачи аппроксимации несколькими методами, рисует графики и осуществляет вывод в файл.
Список использованных источников
Бахвалов, Н. С. Численные методы [Текст] / Н. С. Бахвалов, Н. П. Жидков, Г. М. Кобельников /3-е изд., доп. И перераб. - М. : БИНОМ. Лаборатория знаний, 2004г. - 636 с.
Боглаев, Ю. П. Вычислительная математика и программирование [Текст] : учеб. пособие для студентов вузов / Ю. П. Боглаев. - М. : Высш. шк., 1990. - 544 с. : ил.
Вержбицкий, В. М. Основы численных методов [Текст]: учебник для вузов/В. М. Вержбицкий. - М. : Высш. шк., 2002. - 840с.
Журавлев, С. Г. Дифференциальные уравнения : Сборник задач: примеры и задачи экономики, экологии и других социальных наук [Текст]: учебное пособие для вузов / С. Г. Журавлев, В. В. Аниковский.- М. : Изд. «Экзамен», 2005.- 128 с.
Киреев, В. И. Численные методы в примерах и задачах [Текст] : уч. пособие / В. И. Киреев, А. В. Пантелеев.- М. Высш. шк., 2004.-480 с., ил.
Лапчик, М. П. Численные методы [Текст] : учеб. пособие для студ. вузов / М. П. Лапчик, М. И. Рагулина, Е. К. Хеннер; под ред. М. П. Лапчика. - М. : Издательский центр «Академия», 2004. - 384 с.
Самарский, А. А. Введение в численные методы [Текст]: учебное пособие /А. А. Самарский/ 3-е изд., стер. - СПб.: Издательство «Лань», 2005. - 288 с.
Приложение А
Текст программы
using namespace std;
#include "stdafx.h"
//описание массива
long int fun[2][8] ={
{1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970},
{75994575,91972266,105710620,122775046,131669275,150697361,179323175,203235298}
};
double mat[8][8]; //основная
double mat2[8][8]; //обратная
double mat3[8][8]; //для умножения
// номер полинома
int npol=3;
//счетчики
int i=0;
int j=0;
// суммы полиномов
long int sum1=0;
long int sum2=0;
long int sum3=0;
long int sum4=0;
// Структура, описывающая сплайн на каждом сегменте сетки
struct spline_tuple
{
double a, b, c, d, x;
};
spline_tuple *splines; // Сплайн
//вывод основной таблицы
void OutFun()
{
std::cout<<" x y"<<std::endl;
for (j=0; j<=7; j++){
for (i=0; i<=1; i++){
std::cout.width(16);
std::cout<<fun[i][j];
}
std::cout<<std::endl;
}
}
// вывод матрицы полинома
void OutMat()
{
for (j=0; j<=7; j++){
for (i=0; i<=7; i++){
std::cout.width(14);
std::cout<<mat[i][j];
}
std::cout<<std::endl;
}
system("pause");
}
//функции для вычисления обратной матрицы
//умножение
void mult8(double matup[8][8], double matdown[8][8])
{
for(int i= 0; i< 8; i++)
for (int j = 0; j < 8; j++)
{
mat3[i][j]=0;
for (int k = 0;k <8; k++)
mat3[i][j]+=(matup[i][k] * matdown [k][j]);
}
}
//определитель
float det (double a[8][8])
{
intp=0;
int n=8;
int t;
int k;
float kst=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
kst=pow(-1.0, p);
for(i=0; i<n; i++)
kst*=a[i][i];
return kst;
}
// минор
int GetMinor(double A[8][8], double B[8][8], int x, int y, int size)
{
int xCount = 0, yCount = 0;
int i, j;
for(i = 0; i < size; i++ )
{
if( i != x )
{
yCount = 0;
for(j = 0; j < size; j++)
{
if( j != y )
{
B[xCount][yCount] = A[i][j];
yCount++;
}
}
xCount++;
}
}
return 0;
}
//матрица алгебраических дополнений
double FindAlgDop(double A[8][8], int size, double B[8][8])
{
int i, j;
// находим определитель матрицы A
float detr = det (A);
if(detr > 0) // это для знака алгебраического дополнения
detr = -1;
else
detr = 1;
double minor[8][8];
for(j = 0; j < size; j++)
{
for(i = 0;i < size; i++)
{
// получаем алгебраическое дополнение
GetMinor(A, minor, j, i, size);
if( (i+j)%2 == 0)
B[j][i] = -detr*det(minor);
else
B[j][i] = detr*det(minor);
}
}
return B[8][8];
}
// транспонирование матрицы
double transpon (double matrix[8][8])
{
double t;
for (int i=0; i<8; i++)
{
for (int j=1; j<8; j++)
{
t=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=t;
}
}
return matrix [8][8];
}
// обратная матрица
double inversm (double matrix[8][8])
{
float detm = det (matrix);
double cmat[8][8];
FindAlgDop(matrix, 8, cmat);
transpon(cmat);
for (int i=0; i<7; i++)
{
for (int j=0; j<7; j++)
{
double a=*cmat[i,j];
matrix[i][j]=(a/detm);
}
}
return matrix [8][8];
}
// норма матрицы
float norma(double matrix[8][8])
{
int i,j;
float tmp = 0;
for (i = 0; i < 7; i++)
for (j = 0; j < 7; j++)
tmp += matrix[i][j] * matrix[i][j];
return sqrt(tmp);
}
void RCond()
{
double conds [4];
// первая матрица
for (j=0; j<=7; j++){
for (i=0; i<=7; i++){
mat[i][j]= pow ((float)fun[1][i],j);
sum1=sum1+(int)mat[i][j];
}
}
std::cout<<"Matrica 1"<<std::endl;
OutMat();
mat2[8][8]=inversm(mat);
conds[0]=norma(mat) * norma (mat2);
std::cout<<"Chislo obuslovlennosti matricy 1 = "<< conds[0] <<std::endl;
// вторая матрица
for (j=0; j<=7; j++){
for (i=0; i<=7; i++){
mat[i][j]=pow ((float)fun[1][i]-1900,j);
sum2=sum2+(int)mat[i][j];
}
}
std::cout<<"Matrica 2"<<std::endl;
OutMat();
mat2[8][8]=inversm(mat);
conds[1]=norma(mat) * norma (mat2);
std::cout<<"Chislo obuslovlennosti matricy 2 = "<< conds[1] <<std::endl;
// третья матрица
for (j=0; j<=7; j++){
for (i=0; i<=7; i++){
mat[i][j]=pow ((float)fun[1][i]-1935,j);
sum3=sum3+(int)mat[i][j];
}
}
std::cout<<"Matrica 3"<<std::endl;
OutMat();
mat2[8][8]=inversm(mat);
conds[2]=norma(mat) * norma (mat2);
std::cout<<"Chislo obuslovlennosti matricy 3 = "<< conds[2] <<std::endl;
// четвертая матрица
for (j=0; j<=7; j++){
for (i=0; i<=7; i++){
mat[i][j]=pow (((float)fun[1][i]-1935)/35,j);
sum4=sum4+(int)mat[i][j];
}
}
std::cout<<"Matrica 4"<<std::endl;
OutMat();
mat2[8][8]=inversm(mat);
conds[3]=norma(mat) * norma (mat2);
std::cout<<"Chislo obuslovlennosti matricy 4 = "<< conds[3] <<std::endl;
//номер полинома
for (i=0; i<=3; i++){
if ((int)conds[i]>(int)conds[npol])npol=i;
}
std::cout<<"Polinom N "<< npol+1 <<std::endl;
}
void IPol()
{
long int n1980;
//1980
switch(npol){
case 0:n1980=sum1; break;
case 1:n1980=sum2; break;
case 2: n1980=sum3; break;
case 3: n1980=sum4; break;
default: break;
}
std::cout<<"Chislennost v 1980 = "<< n1980 <<std::endl;
}
void ICubic()
{
int n=7;
// Инициализация массива сплайнов
for (i = 0; i < 7; ++i)
{
splines[i].x = fun[1][i];
splines[i].a = fun[2][i];
}
splines[0].c = 0.;
// Решение СЛАУ относительно коэффициентов сплайнов c[i] методом прогонки для трехдиагональных матриц
// Вычисление прогоночных коэффициентов - прямой ход метода прогонки
double *alpha = new double[7];
double *beta = new double[7];
double A, B, C, F, h_i, h_i1, z;
alpha[0] = beta[0] = 0.;
for (i = 1; i < n - 1; ++i)
{
h_i = fun[1][i] - fun[1][i-1], h_i1 = fun[1][i+1] - fun[1][i];
A = h_i;
C = 2. * (h_i + h_i1);
B = h_i1;
F = 6. * ((fun[2][i+1] - fun[2][i]) / h_i1 - (fun[2][i] - fun[2][i - 1]) / h_i);
z = (A * alpha[i - 1] + C);
alpha[i] = -B / z;
beta[i] = (F - A * beta[i - 1]) / z;
}
splines[n - 1].c = (F - A * beta[n - 2]) / (C + A * alpha[n - 2]);
// Нахождение решения - обратный ход метода прогонки
for (i = n - 2; i > 0; --i)
splines[i].c = alpha[i] * splines[i + 1].c + beta[i];
// Освобождение памяти, занимаемой прогоночными коэффициентами
delete[] beta;
delete[] alpha;
// По известным коэффициентам c[i] находим значения b[i] и d[i]
for (i = n - 1; i > 0; --i)
{
double h_i = fun[1][i] - fun[1][i - 1];
splines[i].d = (splines[i].c - splines[i - 1].c) / h_i;
splines[i].b = h_i * (2. * splines[i].c + splines[i - 1].c) / 6. + (fun[2][i] - fun[1][i-1]) / h_i;
}
std::cout.width(20);
std::cout<<"a b c d x " <<std::endl;
for (i = 0; i < 7; i++)
{
std::cout<<splines[i].a<<" "<<splines[i].b <<" "<<splines[i].c<<" "<<splines[i].d<<" "<<splines[i].x<< std::endl;
}
}
void DrawGraph()
{
system("pause");
system ("cls");
float xfun;
HDC hDC = GetDC(GetConsoleWindow());
HPEN Pen = CreatePen( PS_SOLID, 2, RGB(255, 255, 255));
SelectObject( hDC, Pen );
MoveToEx( hDC, 0, 170, NULL );
LineTo( hDC, 600, 170 );
MoveToEx( hDC, 300, 0, NULL );
LineTo( hDC, 300, 340 );
//оригинальная
system ("echo Оригинальная функция");
MoveToEx( hDC, 0, 170, NULL );
LineTo( hDC, 600, 170 );
MoveToEx( hDC, 300, 0, NULL );
LineTo( hDC, 300, 340 );
i=0;
for (xfun = 1.9f; xfun <= 2.0f; xfun += 0.01f ) // O(300,170) - center
{
if ((fun[1][i]/1000)==xfun)
{MoveToEx( hDC, 100*xfun+300, -100*fun[2][i]/1000000+170, NULL ); //100 - scale
LineTo( hDC, 100*xfun+300, -100*fun[2][i]/1000000+170 );}
i++;
}
system("pause");
//полиномом
system ("cls");
system ("echo Полином");
MoveToEx( hDC, 0, 170, NULL );
LineTo( hDC, 600, 170 );
MoveToEx( hDC, 300, 0, NULL );
LineTo( hDC, 300, 340 );
double s=0;
i=0;
for (xfun = 1.9f; xfun <= 2.0f; xfun += 0.01f ) // O(300,170) - center
{
for (j=0;j<=i;j++)
{
s=s+pow(((float)xfun*1000-1935)/35,j);
}
MoveToEx( hDC, 100*xfun+300, -100*s/1000000+170, NULL ); //100 - scale
LineTo( hDC, 100*xfun+300, -100*s/1000000+170 );
i++;
}
system("pause");
//сплайном
system ("cls");
system ("echo Кубическими сплайнами");
i=0;
for (xfun = 1.9f; xfun <= 2.0f; xfun += 0.01f ) // O(300,170) - center
{
if ((fun[1][i]/1000)==xfun)
{
}
double dx = (xfun*1000 - splines[i].x);
s=splines[i].a + (splines[i].b + (splines[i].c / 2. + splines[i].d * dx / 6.) * dx) * dx;
MoveToEx( hDC, 100*xfun+300, -100*s/1000000+170, NULL ); //100 - scale
LineTo( hDC, 100*xfun+300, -100*s/1000000+170 );
i++;
}
system("pause");
InvalidateRect(GetConsoleWindow(),NULL, TRUE); //очистка
}
void OutputFuncs()
{
int k,l;
double sum1=0;
double sum4=0;
ofstream ofs("text.txt");
ofs<<" x y y(полином 1) y(полином 4) y(сплайн)"<<std::endl;
for (j=0; j<=7; j++){
for (i=0; i<=1; i++){
ofs.width(14);
ofs<<fun[i][j];
}
sum1=pow ((float)fun[1][j],j);
ofs<<" "<<sum1;
sum4=pow (((float)fun[1][j]-1935)/35,j);
ofs<<" "<<sum4;
double dx = (fun[1][j]*1000 - splines[j].x);
double s=splines[j].a + (splines[j].b + (splines[j].c / 2. + splines[j].d * dx / 6.) * dx) * dx;
ofs<<" "<<s;
ofs<<std::endl;
}
ofs.close();
std::cout<<"Fajl uspeshno sozdan" << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
splines = new spline_tuple[7];
int a=11;
while (a!=0)
{
std::cout<<"Vvedite chislo dla vybora (ot 1 do 6), 0 dla vyhoda"<<std::endl;
std::cout<<"1:Vyvod tablichnoj funkcii"<<std::endl;
std::cout<<"2:Ocenka obuslovlenosti"<<std::endl;
std::cout<<"3:Interpolacia polinomom"<<std::endl;
std::cout<<"4:Interpolacia splajnom"<<std::endl;
std::cout<<"5:Grafiki"<<std::endl;
std::cout<<"6:Vyvod v fajl"<<std::endl;
std::cin>>a;
switch(a){
case 1: OutFun(); break;
case 2: RCond(); break;
case 3: IPol(); break;
case 4: ICubic(); break;
case 5: DrawGraph(); break;
case 6: OutputFuncs(); break;
default:std::cout<<"Vvodite tolko ot 1 do 6"<<std::endl; break;
}
}
system("pause");
return 0;
}
Размещено на Allbest.ru
...Подобные документы
Особенности метода аппроксимации табулированных функций. Рассмотрение преимуществ работы в среде математической программы Mathcad. Метод наименьших квадратов как наиболее распространенный метод аппроксимации экспериментальных данных, сферы применения.
курсовая работа [1,2 M], добавлен 30.09.2012Методы снижения погрешности аппроксимирующих зависимостей на примере определения влажности нефти прибором "Ультрафлоу". Синтезирование математической модели для расчета влажности нефти на основе показаний датчиков доплеровского сдвига частоты и влажности.
статья [33,7 K], добавлен 15.05.2014Основные правила преобразования графиков на примерах элементарных функций: преобразование симметрии, параллельный перенос, сжатие и растяжение. Построение графиков сложных функций с помощью последовательных преобразований графиков элементарных функций.
презентация [2,4 M], добавлен 16.11.2010Понятие функции в древнем мире: Египет, Вавилон, Греция. Графическое изображение зависимостей, история возникновения. Вклад в развитие графиков функций Рене Декартом. Определение функций: понятие и способы задания. Методы построения графиков функций.
реферат [3,5 M], добавлен 09.05.2009Разделенные разности и аппроксимация функций методом наименьших квадратов. Интерполяционные многочлены Лагранжа и Ньютона. Экспериментальные данные функциональной зависимости. Система уравнений для полинома. Графики аппроксимирующих многочленов.
реферат [139,0 K], добавлен 26.07.2009Способы построения интерполяционных многочленов Лагранжа, основные этапы. Интерполирование функций многочленами Ньютона, способы построения графика. Постановка задачи аппроксимации функции одной переменной, предпосылки повышения точности расчетов.
презентация [204,5 K], добавлен 18.04.2013Нахождение пределов функций. Определение значения производных данных функций в заданной точке. Проведение исследования функций с указанием области определения и точек разрыва, экстремумов и асимптот. Построение графиков функций по полученным данным.
контрольная работа [157,0 K], добавлен 11.03.2015Аппроксимация функций методом наименьших квадратов. Описание программного средства: спецификация переменных, процедур и функций, схемы алгоритмов. Реализация расчетов в системе Mathcad. Порядок составления графика в данной среде программирования.
курсовая работа [808,9 K], добавлен 09.05.2011Пределы функций и их основные свойства, операция предельного перехода, бесконечно малые функции. Производная функции, важнейшие правила дифференцирования, правило Лопиталя. Применение дифференциала функции в приближенных вычислениях, построение графиков.
методичка [335,2 K], добавлен 18.05.2010Понятие и основные свойства обратной функции. Нахождение функции, обратной данной. Область определения функции. Обратимость монотонной функции. Построение графиков функций и определение их свойств. Симметричность графиков функций относительно прямой у=х.
презентация [98,6 K], добавлен 18.01.2015Оценка неизвестных величин по результатам измерений, содержащим случайные ошибки, при помощи метода наименьших квадратов. Аппроксимация многочленами, обзор существующих методов аппроксимации. Математическая постановка задачи аппроксимации функции.
курсовая работа [1,9 M], добавлен 12.02.2013Интерполяция (частный случай аппроксимации). Аппроксимация функцией. Метод наименьших квадратов. Из курса математики известны 3 способа задания функциональных зависимостей: аналитический, графический, табличный.
реферат [70,4 K], добавлен 26.05.2006Построение графиков функций F(x), симметричное их отбражение относительно оси координат ОХ, ОУ, при значениях -F, -x. Особенности построения графиков функций и симметричное отображение относительно осей координат: f(x)+A; f(x+а); kf(x); |f(x)|; |f(|x|)|.
контрольная работа [82,1 K], добавлен 18.03.2010Построение приближающей функции, используя исходные данные, с помощью методов Лагранжа, Ньютона и Эйткена (простая и упрощенная форма реализации). Алгоритм вычисления интерполяционного многочлена. Сравнение результатов реализации методов в среде Mathcad.
курсовая работа [299,3 K], добавлен 30.04.2011Рассмотрение понятия и сущности линеаризации. Изучение способов линейной аппроксимации функции преобразования средств измерений. Поиск погрешностей линеаризации; сопоставление полученных результатов для каждого метода на примере решения данных задач.
контрольная работа [46,4 K], добавлен 03.04.2014Первообразная и неопределённый интеграл. Описание вычисления неопределенного интеграла в системе Mathcad, его свойства. Примеры вычисления функций в системе Mathcad. Вычисление значения результирующей функции. Подведение функций под знак дифференциала.
курсовая работа [454,6 K], добавлен 24.12.2012Ознакомление с принципами параллельного переноса, растяжения и сжатия функции y=f(x) вдоль осей Ох и Оу. Рассмотрение правил симметрического отображения функции относительно осей координат. Особенности сложения и умножения ординат точек графиков.
презентация [356,6 K], добавлен 16.12.2011Нахождение производных функций, построение графика функции с помощью методов дифференциального исчисления, нахождение точки пересечения с осями координат. Исследование функции на возрастание и убывание, нахождение интегралов, установка их расходимости.
контрольная работа [130,5 K], добавлен 09.04.2010Вычисление приближенных величин и погрешностей. Решение алгебраических и трансцендентных уравнений, интерполяция функций и методы численного интегрирования. Применение метода наименьших квадратов к построению эмпирических функциональных зависимостей.
курсовая работа [378,5 K], добавлен 08.01.2013Исследование функции на непрерывность. Определение производных показательной функции первого и второго порядков. Определение скорости и ускорения материальной точки, движущейся прямолинейно по закону. Построение графиков функций, интервалов выпуклости.
контрольная работа [180,3 K], добавлен 25.03.2014