Применение программных средств для анализа и обработки данных
Нахождение алгебраических и трансцендентных уравнений с помощью программы. Суть решения систем линейных и дифференциальных равенств. Анализ определения коэффициентов аппроксимирующей зависимости наименьших квадратов. Решение систем задач методом Крамера.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.11.2016 |
Размер файла | 545,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ «МИСиС» ИНСТИТУТ ИНМИН КАФЕДРА ИНЖЕНЕРНАЯ КИБЕРНЕТИКА
КУРСОВАЯ РАБОТА
на тему: Применение программных средств для анализа и обработки данных
Студент
Иванова М.П.
Руководитель работы
Кружкова Г.В.
Москва 2014
Оглавление
Введение
1. Нахождение алгебраических и трансцендентных уравнений
1.1 Метод половинного деления
1.2 Практическая часть
1.3 Метод Ньютона
1.4 Практическая часть
2. Аппроксимация функции
2.1 Метод наименьших квадратов
3. Решение систем линейных уравнений
3.1 Метод Крамера
3.2 Практическая часть
4. Решение дифференциального уравнения
4.1 Метод Эйлера
4.2 Практическая часть
Заключение
Список литературы
Введение
Настоящая курсовая работа имеет своей целью углубление и расширение теоретических знаний, и закрепление практических навыков по разделам информатики. Данная курсовая работа содержит теоретическую часть (описание решаемой задачи, описание метода и алгоритма решения задачи) и практическую часть, выполненную на компьютере с использованием программ С# и Mathcad.
1. Нахождение алгебраических и трансцендентных уравнений
1.1 Метод половинного деления
Метод деления отрезка пополам -- простейший численный метод для решения нелинейных уравнений вида f(x)=0. Предполагается только непрерывность функции f(x). Поиск основывается на теореме о промежуточных значениях.
Перед применением метода для поиска корней функции необходимо отделить корни одним из известных способов, например, графическим методом. Отделение корней необходимо в случае, если неизвестно на каком отрезке нужно искать корень. Иллюстрация к методу половинного деления представлена на рисунке 1.
Рисунок 1 - Иллюстрация к методу половинного деления
Будем считать, что корень функции отделён на отрезке . Задача заключается в том, чтобы найти и уточнить этот корень методом половинного деления. Другими словами, требуется найти приближённое значение корня с заданной точностью .
Пусть известен отрезок [a, b], на котором уравнение f(x) = 0 имеет один корень. Разделим отрезок [a, b] пополам и определим координату середины x = (a + b)/2. Если f(x) = 0, то x является корнем уравнения. Если f(x) < > 0, то выбираем тот из отрезков [а, x] или [x, b], на концах которого функция имеет противоположные знаки. Для этого будем проверять условие f(a)*f(x) < 0. Если условие выполняется, то корень находится на отрезке [а, x], и тогда значение x нужно переслать в переменную b. Если условие f(a)*f(x) < 0 не выполняется, это означает, что корня в левой половине нет, а значит, корень находится на отрезке [x,b]. В этом случае значение x пересылаем в переменную a. Таким образом, задача сводится к исходной постановке, когда требуется делить пополам теперь уже новый отрезок [a, b]. Деление необходимо прекратить, когда будет достигнута необходимая точность ?, т.е. когда будет выполнено условие abs(b - а) <= ?. Таким образом, решение задачи сводится к организации цикла по условию [1, 2].
1.2 Практическая часть
Метод половинного деления
Найти интервалы локализации корней на отрезке [-10, 10], в каждом из интервалов найти корень многочлена с заданной точностью (10 -4 ) с помощью метода половинного деления: P(x) = x5 + 2x4 - 58x3 - 44x2 + 729x - 628.5
Текст программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication36
{
class Program
{
static double f(double x)
{
double f1 = Math.Pow(x, 5) + 2 * Math.Pow(x, 4) - 58 * Math.Pow(x, 3) -44 * x * x +729 * x - 628.5;
return f1;
}
static double fcor(double a1, double b1, double e1)
{
double a = a1, b = b1, x;
do
{
x = (a + b) / 2;
if (f(x) * f(a) > 0)
a = x;
else
b = x;
}
while (Math.Abs(a - b) >= e1);
return x = (a + b) / 2;
}
static void Main(string[] args)
{
double a = -10.0, b = 10.0, h;
double x = 0;
int n = 20;
h = (b - a) / n;
Console.WriteLine("Аргумент \t Функция");
for (x = a; x < b; x = x + h)
{
Console.WriteLine("{0:f2}\t\t{1:f2}", x, f(x));
}
double eps = 0.0001, cor = 0;
Console.WriteLine("Начало\tКонец\t Корень\t Проверка");
for (x = a; x < b - h; x = x + h)
{
if (f(x) * f(x + h) < 0)
{
cor = fcor(x, x + h, eps);
Console.WriteLine("{0:f2}\t{1:f2}\t{2:f5}\t{3:e2}", x, x + h, cor, f(cor));
}
}
Console.ReadKey();
}
}
}
Результат
На рисунке 2 представлены результаты решения в программе Microsoft Visual C#.
Рисунок 2 - Результат в Microsoft Visual C#
Проверка
На рисунке 4 представлены результаты решения в программе Mathcad.
Рисунок 4 - Проверка результатов в Mathcad
Реализован метод половинного деления с требуемой точностью. Из графика видно, что найдены все корни на заданном отрезке, интервалы изоляции определены точно.
1.3 Метод Ньютона
Пусть задано уравнение , причем и определены, непрерывны и сохраняют постоянные знаки на отрезке . Рассмотрение метода Ньютона начнем с геометрического представления.
Рисунок 5 - Геометрическое представление метода Ньютона
Выберем на отрезке некоторую точку и проведем в точке графика функции касательную к кривой до пересечения с осью . Абсциссу точки пересечения можно взять в качестве приближенного значения корня. Проведя касательную через новую точку и найдя точку ее пересечения с осью , получим второе приближение корня . Аналогично вычисляются последующие приближения. Так как тангенс угла наклона касательной к графику функции численно равен производной функции в этой точке, то, рассматривая треугольник с вершинами в точках (,0), (,0), , получаем
.
Отсюда
,
Аналогично получаем
Процесс последовательного вычисления значений (1, 2, …) называется процессом последовательных приближений по методу Ньютона( метод касательных).
Если начальное приближение выбрано так, что выполнено условие
,
то сходимость метода Ньютона гарантирована. Если корень уравнения необходимо вычислить с точностью , то процесс вычисления приближений следует прекратить, когда для двух последовательных приближений и будет выполняться условие
,
где - наименьшее значение на отрезке ; - наибольшее значение на отрезке . При этом выполняется условие
,
где - заданная предельная абсолютная погрешность корня
Если , то вместо (1) можно пользоваться соотношением
.
Выбор начального приближения в методе Ньютона. Как следует из условия сходимость итерационной последовательности, получаемой в методе Ньютона, зависит от выбора начального приближения .
В общем случае, если задан отрезок , содержащий корень, и известно, что функция монотонна на этом отрезке, то в качестве начального приближения можно выбрать ту границу отрезка , где совпадают знаки функции и второй производной . Такой выбор начального приближения гарантирует сходимость метода Ньютона при условии монотонности функции на отрезке локализации корня [1,4] .
1.4 Практическая часть
Метод Ньютона
Найти корень уравнения f(х)=0 для функции методом Ньютона с точностью 0.0001. Убедиться в правильности решения, подставив полученный корень в уравнение:
f(x) = v(1-0,4x)-arcsinx , интервал изоляции корня [0; 1]
Текст программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static double N(double x)
{
double f = (1-0.4*x*x)*Math.Pow(x,0.5)-Math.Asin(x);
return f;
}
static double K(double x)
{
double k1 = -1 / (1 - x * x) * Math.Pow(x, 0.5) - 0.4 * x / (1 - 0.4 * x * x) * Math.Pow(x, 0.5);
return k1;
}
static double L(double x)
{
double l1 = -0.16*x*x/(1-0.4*x*x)*Math.Pow(x,1.5)-x/(1-x*x)*Math.Pow(x,1.5)-0.4/(1-0.4*x)*Math.Pow(x,0.5);
return l1;
}
static double Nc(double x, double e1)
{
double x1 = x, x2, d;
do
{
x2 = x1 - N(x1) / K(x1);
d = Math.Abs(x2 - x1);
x1 = x2;
}
while (d >= e1);
return x1 = x2;
}
static void Main(string[] args)
{
double a = 0.0, b = 1, h;
int n = 20, i;
h = (b - a) / n;
double[] x = new double[n + 1];
Console.WriteLine("X \t\t Y");
for (i = 0; i < n + 1; i++)
{
x[i] = a + h * i;
Console.WriteLine("{0:f2}\t\t{1:f2}", x[i], N(x[i]));
}
double eps = 0.0001, c = 0;
Console.WriteLine("Начало\t Конец\t Корень\t\t Проверка");
for (i = 0; i < n; i++)
{
if (N(x[i]) * N(x[i + 1]) < 0)
{
if (N(x[i + 1]) * L(x[i + 1]) > 0)
{
c = Nc(x[i + 1], eps);
Console.WriteLine("{0:f2}\t {1:f2}\t {2:f5}\t\t {3:e2}", x[i], x[i + 1], c, N(c));
}
else
{
c = Nc(x[i], eps);
Console.WriteLine("{0:f2}\t{1:f2}\t{2:f5}\t\t{3:e2}", x[i], x[i + 1], c, N(c));
Console.ReadKey();
Результат
Результаты решения задачи представлены на рисунке 6.
Рисунок 6 - Результат в Microsoft Visual C#
Проверка
Результаты решения задачи представлены на рисунке 7.
Рисунок 7 - Проверка результатов в Mathcad
Вывод: реализован численный метод Ньютона, корень на заданном интервале найдет с требуемой точностью.
2. Аппроксимация функции
2.1 Метод наименьших квадратов
Аппроксимация-это нахождение аналитической (аппроксимирующей) зависимости, наиболее близкой к табличным данным. В качестве критерия близости чаще всего используют минимум суммы квадратов отклонений табличных значений от вычисленных по аналитической зависимости при одинаковых значениях входных параметров. Метод определения коэффициентов , ..., на основе этого критерия носит название метода наименьших квадратов (МНК).
Метод наименьших квадратов - метод определения коэффициентов аппроксимирующей зависимости на основе этого критерия.
Вначале определяют общий вид аппроксимирующей функции, а затем ее коэффициенты по методу наименьших квадратов.
Вывод формул определения параметров линейной аппроксимации на рисунке 9: трансцендентный уравнение линейный дифференциальный
Рисунок 9 - Иллюстрация к методу наименьших квадратов
Рассмотрим случай линейной функции одного аргумента. Пусть из опыта получены точки:
Пусть мы нашли такую прямую. Обозначим через расстояние опытной точки от этой прямой (измеренное параллельно оси y).
Из уравнения (2) следует, чтоЧем меньше числа по абсолютной величине, тем лучше подобрана прямая (2). В качестве характеристики точности подбора прямой (2) можно принять сумму квадратов
Сумма квадратов отклонений:
Величина S является функцией неизвестных коэффициентов a, b. Чтобы получить уравнения для их определения, воспользуемся тем, что в точке достижения минимума частные производные функции S по a и b равны нулю, т. е.
,
Обозначим
,
n * a + p *b = q
p * a + r * b = t
Решение системы этих уравнений дает значение коэффициентов a и b зависимости f(x)
3. Решение систем линейных уравнений
3.1 Метод Крамера
Метод Крамера (правило Крамера) -- способ решения систем линейных алгебраических уравнений с числом уравнений равным числу неизвестных с ненулевым главным определителем основной матрицы (причём для таких уравнений решение)
Для системы линейных уравнений с неизвестными (над произвольным полем)
с определителем матрицы системы , отличным от нуля, решение записывается в виде
(i-ый столбец матрицы системы заменяется столбцом свободных членов).
В другой форме правило Крамера формулируется так: для любых коэффициентов c1, c2, …, cn справедливо равенство:
В этой форме формула Крамера справедлива без предположения, что отлично от нуля, не нужно даже, чтобы коэффициенты системы были бы элементами целостного кольца (определитель системы может быть даже делителем нуля в кольце коэффициентов). Можно также считать, что либо наборы и , либо набор состоят не из элементов кольца коэффициентов системы, а какого-нибудь модуля над этим кольцом. В этом виде формула Крамера используется, например, при доказательстве формулы для определителя Грама и Леммы Накаямы[1,5].
3.2 Практическая часть
Метод наименьших квадратов. Решение систем линейных уравнений методом Крамера.
Найти коэффициенты уравнения, используя метод наименьших квадратов
f(x)= a+bx+cx^(2/3)
Текст программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void przv(double[,] x, double[,] y, int n, int m, int p, ref double[,] z)
{//метод, который перемножает матрицы
double s;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
s = 0;
for (int l = 0; l < p; l++)
{
s = s + x[i, l] * y[l, j];
}
z[i, j] = s;
}
}
}
static void Main(string[] args)
{ //исходные матрицы векторов X и Ф
Console.WriteLine("Исходная таблица");
Console.WriteLine("y x");
double[,] y = { { 7.2, 0 }, { 7.6, 0 }, { 7.9, 0 }, { 8.1, 0 }, { 8.9, 0 }, { 9.9, 0 }, { 10.8, 0 }, { 12, 0 } };
double[,] f = { { 1, 0.01, 0.0464 }, { 1, 0.05, 0.1357 }, { 1, 0.1, 0.2154 }, { 1, 0.5, 0.6299 }, { 1, 1, 1 }, { 1, 1.5, 1.3103 }, { 1, 10, 4.6415 }, { 1, 50, 13.572 } };
for (int i = 0; i < 8; i++)
{
Console.WriteLine("{0,8:f1} {1:f2}", y[i, 0], f[i, 1]);
}
double[,] a = new double[3, 8];
//транспонирование матрицы
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 3; j++)
{
a[j, i] = f[i, j];
}
}
double[,] c = new double[3, 3];
double[,] d = new double[3, 1];
przv(a, f, 3, 3, 8, ref c);
przv(a, y, 3, 1, 8, ref d);
//метод Крамера
for (int i = 0; i < 2; i++)
{
for (int k = i + 1; k < 3; k++)
{
double m = c[k, i] / c[i, i];
for (int j = i + 1; j < 3; j++)
{
c[k, j] = c[k, j] - m * c[i, j];
}
d[k, 0] = d[k, 0] - m * d[i, 0];
}
}
double[] x = new double[3];
for (int i = 2; i >= 0; i--)
{
double s = 0;
for (int j = i + 1; j < 3; j++)
{
s = s + c[i, j] * x[j];
}
x[i] = (d[i, 0] - s) / c[i, i];
}
Console.WriteLine("Аппроксимация функции ");
Console.WriteLine("Общий вид y = ax^2/3+bx+c ");
Console.WriteLine("a = {0:f2}, b= {1:f2} c= {2:f2}", x[2], x[1], x[0]);
Console.ReadKey();
}
}
}
Результат
Результаты решения задачи в Microsoft Visual C# представлены на рисунке 10.
Рисунок 10 - Результат в Microsoft Visual C#
Проверка
Результаты решения задачи в Mathcad представлены на рисунке 11.
Рисунок 11 - Проверка результатов в Mathcad
4. Решение дифференциального уравнения
4.1 Метод Эйлера
Иллюстрация к методу Эйлера представлена на рисунке 12.
Рисунок 12 - Иллюстрация к методу Эйлера (Геометрическое представление)
Для уравнения первого порядка С начальными условиями y(a)=y0. Требуется найти последовательные значения функции y(x) в точках диапазона [a,b]. Дифференциальное уравнение задает наклон кривой y(x) в любой точке x как функцию f(x,y). В начальный момент известна только одна точка, через которую проходит искомая функция: (a, y0). Начинаем с этой точки. Вычисляем значение производной (наклон кривой) при х=а, у=y0, равное f(a, y0), и продвигаемся на некоторое малое расстояние вдоль получившейся касательной. Пусть шаг по оси х равен h=(b-a)/n. Тогда при изменении х на шаг h у изменится на f(a, y0)h, и мы приходим в точку
x=a+h; y1=y0+f(a,y0)h.
Аналогично делаем следующий шаг, считая, что производная на следующем отрезке от a+h до a+2h является постоянной и равной производной в начале этого отрезка, т.е. опять при изменении х на шаг у изменится на f(a+ h,y1)h, и мы приходим в точку х=a+2h, y2=y1+f(a,y1)h и т.д., пока не будет пройден весь отрезок [a,b]. Если шаг h выбран достаточно малым, то можно получить решение с удовлетворительной точностью.
Уравнения более высокого порядка можно привести к системе уравнений первого порядка. Так уравнение второго порядка
y”=f(x,y,y'), y(a)= y0, y'(a)= y0' можно преобразовать следующим образом. Введем обозначение р=y'и подставляя р вместо y' в исходное уравнение, получим
p'=f(x,y,p)
y'=p;
p(a)= y0';
y(a)= y0.
Аналогичные преобразования можно применить и к уравнениям более высокого порядка [1, 6].
4.2 Практическая часть
Решение дифференциального уравнения
Метод Эйлера
Текст программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static double f(double x, double y, double z)
{
return 5 * x * Math.Exp(x) - y + 2 * z;
}
static double fn(double x)
{
return Math.Exp(x) + Math.Exp(x)+5*Math.Exp(x)*x*Math.Pow(x,3)/6;
}
static void Main(string[] args)
{
double a = 0, b = 1, h;
int i, n = 10;
double x, k1, k2, k3, k4, k, S, z;
double[] y = new double[121];
double[] yy = new double[121];
y[0] = 5.1; yy[0] = 4.2; h = (b - a) / n; x = 0;
for (i = 0; i < n; i++)
{
k1 = h * f(x, y[i], yy[i]);
k2 = h * f(x + h / 2, y[i] + h * yy[i] / 2 + h * k1 / 8, yy[i] + k1 / 2);
k3 = h * f(x + h / 2, y[i] + h * yy[i] / 2 + h * k1 / 8, yy[i] + k2 / 2);
k4 = h * f(x + h, y[i] + h * yy[i] + h * k3 / 2, yy[i] + k3);
k = (k1 + k2 + k3) / 6;
S = (k1 + 2 * k2 + 2 * k3 + k4) / 6;
y[i + 1] = y[i] + h * (yy[i] + k);
yy[i + 1] = yy[i] + S;
x = x + h;
}
x = 0;
for (i = 0; i < n + 1; i++)
{
z = fn(x);
Console.WriteLine("x= {0:f2} y= {1:f4} y'={2:f4}", x, y[i], z);
x = x + h;
}
Console.ReadKey();
}
}
}
Результат
Результаты решения задачи в Microsoft Visual C# представлены на рисунке 13.
Рисунок 13 - Результат в Microsoft Visual C#
Проверка
Результаты решения задачи в Mathcad представлены на рисунке 14.
Заключение
Таким образом, в данной курсовой работе описываются решение нелинейных уравнений с одним неизвестным, аппроксимация таблично заданных функций, решение дифференциальных уравнений с использованием как алгоритмов программирования на языке С#, так и с использованием математического пакета Mathcad.
Список литературы
1. Светозарова Г.И Андреева О.В. Информатика. Раздел: Основы программирования на языке Турбо-Бейсик и численные методы. Учебное пособие. М. Из-во «Учеба», 2008. - 127 с.
2. Гопенгауз В.И., Кудрявцев Ю.А. Информатика. Раздел: Прикладные программы в пакете MathCad 2000 Professional.
3. Светозарова Г.И., Бесфамильный М.С., Андреева О.В. Информатика. Прикладные программы в среде Windows. Текстовый редактор Microsoft Word 2000.
Размещено на Allbest.ru
Подобные документы
Матричная форма записи системы линейных уравнений, последовательность ее решения методом исключений Гаусса. Алгоритмы прямого хода и запоминания коэффициентов. Решение задачи о сглаживании экспериментальных данных с помощью метода наименьших квадратов.
курсовая работа [610,7 K], добавлен 25.06.2012Требования к языкам программирования, их эффективность, лаконичность, ясность, реальные возможности. Создание языка С#. Применение систем линейных алгебраических уравнений для практических задач, сущность и особенности метода Крамера для их решения.
курсовая работа [118,1 K], добавлен 13.11.2009Алгоритм решения систем линейных уравнений методом Гаусса, его этапы. Система уравнений для определения коэффициентов сплайна, представляющая собой частный случай систем линейных алгебраических уравнений. Программная реализация, тестовый пример.
курсовая работа [431,8 K], добавлен 15.06.2013Численные методы решения задач. Решение алгебраических и трансцендентных уравнений. Уточнение корня по методу половинного деления. Решение систем линейных уравнений методом итераций. Методы решения дифференциальных уравнений. Решение транспортной задачи.
курсовая работа [149,7 K], добавлен 16.11.2008Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Решение систем алгебраических линейных уравнений методом Крамера. Сущность метода прогонки. Программная реализация метода: блок-схема алгоритма, листинг программы. Проверка применимости данного способа решения для конкретной системы линейных уравнений.
курсовая работа [581,0 K], добавлен 15.06.2013Изучение основных этапов проектирования программных систем, создание прикладной программы, которая выполняет решение систем линейных алгебраических уравнений методом Гаусса. Вычисление определителя и обращение матриц. Листинг разработанной программы.
курсовая работа [563,3 K], добавлен 12.07.2012Использование MS Excel для математических расчетов. Описание численных методов решения системы линейных алгебраических уравнений. Решение систем линейных алгебраических уравнений с методами Крамера и Зейделя и с помощью табличного процессора MS Excel.
курсовая работа [1,6 M], добавлен 14.02.2021Общее понятие о линейных уравнениях и их системах. Разработка программного продукта в среде Delphi 7 для решения методом Крамера квадратных систем линейных алгебраических уравнений с ненулевым определителем основной матрицы. Описание конкретных примеров.
курсовая работа [193,7 K], добавлен 07.07.2013История развития алгоритмических языков. Создание языка С++. Разработка программы в Visual C++ для решения линейных уравнений методом Крамера. Структура данных, этапы тестирования программного обеспечения на работоспособность и корректность расчетов.
курсовая работа [390,0 K], добавлен 29.12.2014