Метод наименьших квадратов

Оценка неизвестных величин по результатам измерений, содержащим случайные ошибки, при помощи метода наименьших квадратов. Аппроксимация многочленами, обзор существующих методов аппроксимации. Математическая постановка задачи аппроксимации функции.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 12.02.2013
Размер файла 1,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное учреждение высшего профессионального образования

Кафедра АСОИУ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

по дисциплине «Вычислительная математика»

на тему «Метод наименьших квадратов»

Ижевск 2012

Введение

Метод наименьших квадратов - один из методов теории ошибок для оценки неизвестных величин по результатам измерений, содержащим случайные ошибки.

Метод наименьших квадратов применяется также для приближённого представления заданной функции другими (более простыми) функциями и часто оказывается полезным при обработке различного рода измерений.

Метод наименьших квадратов был предложен К.Ф. Гауссом и А. Лежандром. Ныне способ представляет собой один из важнейших разделов математической статистики и широко используется для статистических выводов в различных областях науки и техники.

В большинстве экспериментальных данных, задаваемых с помощью табличной функции, имеется достаточно большой разброс точек. При этом использование кусочной или непрерывной интерполяции не всегда оправдано, поскольку ставится задача исследовать общую тенденцию изменения физической величины.

В этом общем случае аппроксимации искомая кривая не обязательно должна проходить через заданные точки. Предполагается использовать кривую, сумма квадратов отклонений в узловых точках минимальна. Именно в таких случая используется метод наименьших квадратов.

1. Обзор существующих методов аппроксимации

1.1 Общая постановка задачи метода наименьших квадратов

Пусть функция принимает в точках значения . Аналитическое выражение функции при этом не известно, данные имеют неустранимую погрешность, а количество точек велико .

В таких случаях применение интерполяции (как, например, интерполяция полиномом Ньютона или интерполяция сплайнами) не приемлемо, т.к интерполяционные функции не будут отражать реального поведения функции.

В таких случаях находиться функция , которая проходит ближе всего к заданным точками, но не обязательно совпадает функцией в узловых точках. Из множества всех возможных функций выбирается такая, что сумма:

минимальна.

Вид функции зависит от конкретного набора точек. Обычно из набора точек, отмеченных в координатных осях, устанавливается примерная зависимость, а с помощью различных методов находятся коэффициенты функции.

1.2 Аппроксимация многочленами

Пусть дана экспериментальная таблица и требуется составить многочлен, степени не выше часто

Данный многочлен должен удовлетворять условию:

где минимум из всех возможных отклонений[2].

Графически это представлено на рисунке 1.1.

Рисунок 1.1 - Метод наименьших квадратов

Необходимым условием минимума функции многих переменных является равенство нулю ее частных производных первого порядка по независимым переменным. В функционале такими независимыми переменными являются коэффициенты многочлена, которые до их определения являются не постоянными, а варьируемыми переменными.

Неоднородная СЛАУ порядка относительно неизвестных является нормальной и, следовательно, ее матрица является симметричной и положительно определенной. Решения удовлетворяют условию наименьшего квадратичного отклонения.

Данную систему можно представить в виде:

и решив её, можно получить коэффициенты наилучшим образом сглаживающих функцию. Если в качестве взять , то полученный многочлен будет являться интерполяционным полиномом.

1.3 Аппроксимация прямой

В данном случае функция имеет вид , а коэффициенты находятся из условия, что

имеет наименьшее значение[3].

Для нахождения коэффициентов, необходимо решить следующую систему уравнений:

Решив данную систему методом Крамера, получим следующие выражения для нахождения :

1.4 Аппроксимация показательной функцией

Степенная зависимость имеет вид

Нахождение параметров показательной функции может быть сведено к нахождению коэффициентов линейной функции. Покажем это.

Прологарифмируем функцию, в результате чего получим равенство:

Введем новую переменную

тогда будет функцией от .

Обозначим:

в таком случае задача свелась к нахождению коэффициентов линейной функции

Для нахождения коэффициентов функции необходимо прологарифмировать значения и , т.е. из таблицы 1.1, получить таблицу 1.2.

Таблица 1.1 - Исходная таблица функции

Таблица 1.2 - Прологарифмированная таблица функции

После этого по таблице 1.2 необходимо найти параметры функции вида

После этого необходимо найти значение по следующей формуле:

То, что аргументы функции и значения функции нужно логарифмировать, налагает ограничение - все точки функции должны находится в первой четверти координатной оси.

1.5 Аппроксимация экспонентой

Данная функция имеет следующий вид:

Воспользуемся приемом из пункта 1.4 и прологарифмируем выражение:

Введем обозначение:

Таким образом мы можем вновь придти к нахождению коэффициентов линейной функции следующего вида:

Однако для нахождения коэффициентов необходимо прологарифмировать значения функции из таблицы 1.1, как показано в таблице 1.3.

Таблица 1.3 - Таблица с прологарифмированными значениями функции

После нахождения коэффициентов необходимо найти значение по следующей формуле:

Как и в предыдущем случае, из-за логарифмирования, на точки функции накладывается ограничение - все они должны находится в первой или второй четвертях координатной оси.

1.6 Аппроксимация дробно-линейной функцией

В данном случае идет поиск коэффициентов функции следующего вида:

Перепишем равенство следующим образом:

Из последнего равенства видно, что для нахождения коэффициентов, нужно составить по таблице 1.1 новую таблицу 1.4.

Таблица 1.4 - Таблица для нахождения коэффициентов для дробно-линейной функции

Послед этого нужно найти коэффициенты по формуле для линейной функции. Из того, что для нахождения обратных значений функции требуется деление, то значение функции не должно быть равны нулю в узловых точках, в крайнем случае такие точки нужно будет попустить при расчете.

1.7 Аппроксимация дробно-рациональной функцией

Дробно-рациональная функция имеет следующий вид:

Для того, чтобы найти ее коэффициенты, преобразуем ее к следующему виду:

Если в исходной функции аргументы и значения функции изменить на обратные, то задача вновь сводится к нахождению коэффициентов прямой.

Для расчетов, нужно по таблице 1.1 составить таблицу 1.5.

Таблица 1.5 - Таблица для нахождения дробно-рациональной функции

После преобразования таблицы, можно находить коэффициенты по формуле для линейной функции. Аргументы функции и ее значения в таблице не должны принимать нулевые значения. Если же этого не избежать, то такие точки нужно будет исключить из расчета.

2. Математическая постановка задачи аппроксимации функции

2.1 Аппроксимация полиномом

Входные данные:

Множество точек такое, что

.

- требуемая степень полинома

Выходные данные:

Множество - коэффициенты полинома

Аналитическое решение:

Алгоритм аппроксимации полиномом:

1) - матрица для решения

2) - вектор ответов

3) Для от 0 до делать

3.1) Для от 0 до делать

3.1.1) Для от 0 до делать

3.1.1.1)

3.1.1.1) Конец делать по

3.1.1) Конец делать по

3.1) Конец делать по

4) Для от 0 до делать

4.1) Для от 0 до делать

4.1.1)

4.1.1) Конец делать по

4.1) Конец делать по

5) Решаем СЛАУ .

6) Вернуть

Графическое представление алгоритма:

На рисунке 2.1 представлена схема алгоритма.

Рисунок 2.1 - Графическое представление алгоритма

2.2 Аппроксимация различными кривыми, нахождение коэффициентов которых сводиться к нахождения коэффициентов прямой

Входные данные:

Множество точек такое, что

.

Выходные данные:

ккоэффициенты функции

Аналитическое решение:

наименьший квадрат аппроксимация многочлен

где - для линейной функции,

- для степенной функции,

- для экспоненты,

- для дробно-линейной функции

- для дробно-рациональной функции.

Алгоритм решения поставленной задачи:

1)

2) Для каждого элемента провести преобразования по таблицам 1.1-1.5 (в зависимости от того, какого вида функцию необходимо найти)

3) Для от 0 до n делать

3.1)

3.2)

3.3)

3.4)

3.5) Конец делать по

4)

5) Если ищем экспоненту или степенную функцию, то иначе

Графическое представление алгоритма:

На рисунке 2.2 изображена схема алгоритма.

Рисунок 2.2 - Схема алгоритма решаемой задачи

3. Тестирование разработанной программы

На рисунке 3.1 представлена работа программы на одном из тестов.

Рисунок 3.1 - Работа программы во время одного из тестов

Тестирование производилось на наборе точек, согласно варианту (18 вариант).

Исходный набор точек представлен в таблице 3.1.

0,950

1,800

2,750

3,800

5,250

6,150

6,900

8,150

9,200

9,850

2,250

2,400

2,083

2,283

2,467

2,417

2,717

3,017

3,317

4,033

10,550

10,950

11,650

12,750

14,150

15,000

15,950

17,200

18,150

19,450

3,850

4,300

4,483

4,250

4,800

4,917

5,133

5,450

5,300

5,550

20,450

20,700

21,850

22,800

23,550

23,800

24,850

25,350

26,050

27,850

5,417

5,833

6,033

6,367

6,667

7,150

6,950

7,400

7,633

7,783

Таблица 3.1 - Набор точек для тестов

В ходе первого теста было выполнено приближение полиномом не выше второй степени. Результаты теста представлены на рисунке 3.2.

Рисунок 3.2 - Аппроксимация полиномом второй степени

Из рисунка видно, что был получен следующий полином:

Сумма квадратов отклонений - .

Сумма отклонений достаточно небольшая, так что можно говорить, что аппроксимация в данном случае довольно точная.

В следующем тесте в качестве аппроксимирующей функции использовалась прямая. Результат показа на рисунке 3.3.

Рисунок 3.3 - Аппроксимация прямой

Получившаяся прямая задается следующим уравнением:

Сумма отклонений при этом составляет , что больше, чем при аппроксимации полиномом второй степени, но разница менее , так что можно сказать, что функции аппроксимирую набор точек примерно с одинаковой точностью.

Следующее приближение было выполнено с помощью степенной функции. Результат показан на рисунке 3.4.

Рисунок 3.4 - Аппроксимация степенной функцией

Получившаяся зависимость:

Сумма отклонений при этом равна , что примерно 4-5 раз хуже, чем при аппроксимации прямой или параболой.

В качестве следующей функции была выбрана экспонента. Результат работы программы изображен на рисунке 3.5.

Рисунок 3.5 - Аппроксимация экспонентой

Получавшая зависимость имеет вид:

При этом сумма квадратов отклонений равна , в 1.5-2 раза хуже, чем приближение прямой или параболой. Однако приближение экспонентой точнее, чем приближение степенной функцией, примерно в 2.5 раза.

Результаты приближения дробно-линейной функцией изображены на рисунке 3.6.

Рисунок 3.6 - Аппроксимация дробно-линейно функцией

Аппроксимирующая функция имеет следующий вид:

Сумма отклонений . Сумма отклонений дробно-линейной функции значительно выше, чем у всех предыдущих функций (от 4 до 20 раз больше).

В качестве последней функции была выбрана дробно-рациональная функция. Результаты работы представлены на рисунке 3.7.

Рисунок 3.7 - Аппроксимация дробно-рациональной функцией

Получившаяся зависимость выглядит следующим образом:

Сумма отклонений равна 58.4304559204583. Из всех представленных функций, данная функция имеет наибольшую сумму квадратов отклонений.

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

Заключение

В результате проделанной работы были изучены способы аппроксимации функции методом наименьших квадратов. В качестве аппроксимирующих кривых были выбраны: полином, прямая, степенная функция, экспонента, дробно-линейная функция и дробно-рациональная функция.

Для каждого различного набора точек, наилучшим образом сглаживать его будет различная функция.

Был составлен алгоритм решения задачи различными способами.

На основании алгоритмов была составлена программа, реализующая данные методы.

Для тестового набора данных было установлено, что наилучшее сглаживание дает парабола. Также достаточно хорошо слаживает набор точек прямая.

Список литературы

1 А.А. Амосов, Ю.А. Дубинский, Вычислительные методы для инженеров. -- М.: Высш.шк., 1994. - с.544

2 Н.С. Бахвалов, Численные методы. -- М.: Наука, 1975. - с.190

3 Б.П. Демидович, Основы вычислительной математики. - М.:Наука, 1966. -с.664

Приложение А (обязательное)

Текст программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ComCtrls, ExtDlgs, StdCtrls, math, ExtCtrls,ShellAPI;

type

//типы функция

fnType = (fnLine,fnPower,fnExp,fnDrLine,fnDrRac,fnPolinom);

//структура для коэффицниетов не полинома

TKoef = record

k,b:extended;

isKorret:boolean;

end;

//точка на плоскости

TPoint2d = record

x,y:extended;

end;

TPointArray = array of TPoint2d;

Tmas = array of extended;

Tmatrix = array of array of extended;

TForm1 = class(TForm)

ListView1: TListView;

Button1: TButton;

OpenTextFileDialog1: TOpenTextFileDialog;

PaintBox1: TPaintBox;

ComboBox1: TComboBox;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Edit3: TEdit;

Label3: TLabel;

Button2: TButton;

Label4: TLabel;

ColorBox1: TColorBox;

Memo1: TMemo;

Button3: TButton;

Label5: TLabel;

TrackBar1: TTrackBar;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure PaintBox1Paint(Sender: TObject);

procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure TrackBar1Change(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

BildFunction:boolean;

FuncType:fnType;

polinom:Tmas;

koef:TKoef;

ch,cw:integer;

{ Private declarations }

public

//получить точки из файла

procedure GetPointsOutFile(path:string);

//решить систему методом Гаусса

function SolveGauss(matrix:TMatrix):Tmas;

//получить коэффициенты полинома

function GetPolinomKoef(points:TPointArray; m:integer):Tmas;

//получить коэффициенты не полинома

function GetFuncKoef(points:TPointArray; fType:fnType):TKoef;

//значение функции от полинома

function F(func:Tmas; x:extended):extended;

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);

var points:TPointArray;

I,m: Integer;

fType:fnType;

sum:extended;

begin

setLength(points,ListView1.Items.Count);

for I:= 0 to ListView1.Items.Count - 1 do

begin

points[i].x:=strToFloat(ListView1.Items[i].Caption);

points[i].y:=strToFloat(ListView1.Items[i].SubItems[0]);

end;

case (comboBox1.ItemIndex) of

// установливаем тип фукнции

0: fType:=fnPolinom;

1: fType:=fnLine;

2: fType:=fnPower;

3: fType:=fnExp;

4: fType:=fnDrLine;

5: fType:=fnDrRac

else

begin

ShowMessage('Не выбран тип функции');

exit;

end;

end;

//если полином

if fType=fnPolinom then

begin

m:=strToInt(edit2.Text);

polinom:=GetPolinomKoef(points,m);

memo1.Clear;

memo1.Lines.Add('');

for i:= m downto 1 do

memo1.Lines[0]:=memo1.Lines[0] +

format('%.4fx^%d+',[polinom[i],i]);

memo1.Lines[0]:=memo1.Lines[0] + Format('%.4f',[polinom[0]]);

bildFunction:=true;

funcType:=fnPolinom;

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-F(polinom,points[i].x)),2);

edit3.Text:=floatToStr(sum);

end;

//если не полином))))

if (fType<>fnPolinom) then

begin

koef:=GetFuncKoef(points,fType);

if (not koef.isKorret) then

begin

memo1.Lines[0]:='Не возможно по данным точкам посторить выбранную кривую';

bildFunction:=false;

exit;

end;

bildFunction:=true;

FuncType:=fType;

case fType of

//обрабатываем в зависимости от типа

fnLine:

begin

memo1.Lines[0]:=Format('f(x) = %.4fx+%.4f',[koef.k,koef.b]);

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-(koef.k*points[i].x+koef.b)),2);

edit3.Text:=floatToStr(sum);

end;

fnPower:

begin

memo1.Lines[0]:=Format('f(x) = %.4fx^%.4f',[koef.b,koef.k]);

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-(koef.b*power(points[i].x,koef.k))),2);

edit3.Text:=floatToStr(sum);

end;

fnExp:

begin

memo1.Lines[0]:=Format('f(x) = %.4fe^%.4fx',[koef.b,koef.k]);

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-(koef.b*exp(koef.k*points[i].x))),2);

edit3.Text:=floatToStr(sum);

end;

fnDrLine:

begin

memo1.Lines[0]:=Format('f(x) = 1/(%.4fx+%.4f)',[koef.k,koef.b]);

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-(1/(koef.k*points[i].x+koef.b))),2);

edit3.Text:=floatToStr(sum);

end;

fnDrRac:

begin

memo1.Lines[0]:=Format('f(x) = x/(%.4fx+%.4f)',[koef.b,koef.k]);

sum:=0;

for I:= 0 to length(points) - 1 do

sum:=sum + power((points[i].y-(points[i].x/(koef.b*points[i].x+koef.k))),2);

edit3.Text:=floatToStr(sum);

end;

end;

end;

PaintBOx1.Repaint;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

//запускаем руководство пользователя

ShellExecute(Handle, nil, PWideChar('Справка.docx'),nil

, nil, SW_SHOW);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

form1.Text:='Аппроксимация';

bildFunction:=false;

Polinom:=nil;

koef.isKorret:=false;

ch:=PaintBox1.Height div 2;

cw:=PaintBox1.Width div 6;

end;

function TForm1.F(func: Tmas; x: Extended):extended;

var i:integer;

begin

result:=0;

for I:= 0 to length(func) - 1 do

result:=result + func[i]*power(x,i);

end;

Function Tform1.GetFuncKoef(points: TPointArray; fType: fnType):Tkoef;

var k,A:extended;

i:integer;

Sx,Sxx,Sy,Sxy:extended;

Res:word;

n:integer;

begin

n:=0;

Sx:=0; Sxx:=0; Sy:=0; Sxy:=0;

case fType of

fnLine:

begin

for I:= 0 to length(points) - 1 do

begin

inc(n);

Sx:=Sx+points[i].x;

Sxx:=Sxx + power(points[i].x,2);

Sy:=Sy + points[i].y;

Sxy:=Sxy + points[i].x*points[i].y;

end;

end;

fnPower:

begin

for I:= 0 to length(points) - 1 do

begin

if (points[i].x<0.00000000001) or

(points[i].y<0.00000000001) then

begin

Res:=MessageBox(Handle,PChar(Format('Точка (%f; %f) не удовлетваряет формату.\n',

[points[i].x,points[i].y])+'Пропустить ее?'),Pchar('Не верная точка'),

MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2);

if Res=IDYes then continue;

result.isKorret:=false;;

exit;

end;

inc(n);

Sx:=Sx + ln(points[i].x);

Sxx:=Sxx + power(ln(points[i].x),2);

Sy:=Sy + ln(points[i].y);

Sxy:=Sxy + ln(points[i].x)*ln(points[i].y);

end;//for i

end;//fnPower

fnExp:

begin

for I:= 0 to length(points) - 1 do

begin

if (points[i].x<0.00000000001) then

begin

Res:=MessageBox(Handle,PChar(Format('Точка (%f; %f) не удовлетваряет формату.\n',

[points[i].x,points[i].y])+'Пропустить ее?'),PChar('Не верная точка'),

MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2);

if Res=IDYes then continue;

result.isKorret:=false;

exit;

end;

inc(n);

Sx:=Sx + points[i].x;

Sxx:=Sxx + power(points[i].x,2);

Sy:=Sy + ln(points[i].y);

Sxy:=Sxy + points[i].x*ln(points[i].y);

end;//for i

end;//fnExp;

fnDrLine:

begin

for I:= 0 to length(points) - 1 do

begin

if (abs(points[i].y)<0.00000000001) then

begin

Res:=MessageBox(Handle,PChar(Format('Точка (%f; %f) не удовлетваряет формату.\n',

[points[i].x,points[i].y])+'Пропустить ее?'),PChar('Не верная точка'),

MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2);

if Res=IDYes then continue;

result.isKorret:=false;

exit;

end;

inc(n);

Sx:=Sx + points[i].x;

Sxx:=Sxx + power(points[i].x,2);

Sy:=Sy + 1/points[i].y;

Sxy:=Sxy + points[i].x/points[i].y;

end;//for i

end;//fnDrLine;

fnDrRac:

begin

for I:= 0 to length(points) - 1 do

begin

if (abs(points[i].y)<0.00000000001) or

(abs(points[i].x)<0.00000000001) then

begin

Res:=MessageBox(Handle,PChar(Format('Точка (%f; %f) не удовлетваряет формату.\n',

[points[i].x,points[i].y])+'Пропустить ее?'),PChar('Не верная точка'),

MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2);

if Res=IDYes then continue;

result.isKorret:=false;

exit;

end;

inc(n);

Sx:=Sx + 1/points[i].x;

Sxx:=Sxx + 1/power((points[i].x),2);

Sy:=Sy + 1/points[i].y;

Sxy:=Sxy + 1/(points[i].x*points[i].y);

end;//for i

end;//fnDrRac;

fnPolinom:

begin

result.isKorret:=false;

exit;

end;

end;//case of

k:=(n*Sxy-Sy*Sx)/(n*Sxx-Sx*Sx);

A:=(Sxx*Sy-Sx*Sxy)/(n*Sxx-Sx*Sx);

if (fType=fnExp) or (fType=fnPower) then A:=exp(A);

result.k:=k;

result.b:=a;

result.isKorret:=true;

end;

function TForm1.GetPolinomKoef(points: TPointArray; m:integer):Tmas;

var matrix:Tmatrix;

i,j,k:integer;

begin

setLength(matrix,m+1,m+2);

for I:= 0 to length(matrix) - 1 do

for j:= 0 to length(matrix) - 1 do

for k:= 0 to length(points) - 1 do

matrix[i,j]:=matrix[i,j] + power(points[k].x,i+j);

for I:= 0 to length(matrix) - 1 do

for j:= 0 to length(points) - 1 do

matrix[i,m+1]:=matrix[i,m+1]+points[j].y*power(points[j].x,i);

result:=SolveGauss(matrix);

end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

cw:=x;

ch:=y;

PaintBox1.Repaint;

end;

procedure TForm1.PaintBox1Paint(Sender: TObject);

var p:TpointArray;

i,m:integer; //m - масштаб графика

x,y:integer;

t:real;

begin

m:=trackBar1.Position;

//получаем точки

setLength(p,ListView1.Items.Count);

for I:= 0 to ListView1.Items.Count - 1 do

begin

p[i].X:=strToFloat(listView1.Items[i].Caption);

p[i].Y:=strToFloat(ListView1.Items[i].SubItems[0]);

end;

with paintbox1.Canvas do

begin

pen.Color:=clBlack;

moveTo(cw,0);

lineTo(cw,PaintBox1.Height);

moveTo(0,ch);

lineTo(paintBox1.width,ch);

//устанавливаем точки

for I:= 0 to length(p) - 1 do

ellipse(round(p[i].x*m)-3+cw,-round(p[i].y*m)-3+ch,

round(p[i].x*m)+3+cw,-round(p[i].y*m)+3+ch);

if (bildFunction) then

begin

case funcTYpe of

fnLine:

begin

pen.Color:=colorBox1.Selected;

t:=p[0].x;

moveTo(round(t*m)+cw,-round((koef.k*t+koef.b)*m)+ch);

while (t<p[length(p)-1].x) do

begin

x:=round(t*m)+cw;

y:=-round((koef.k*t+koef.b)*m)+ch;

lineTo(x,y);

t:=t+0.1;

end;//while

end;//fnLine;

fnPower:

begin

pen.Color:=colorBox1.Selected;

t:=0;

moveTo(round(t*m)+cw,-round((koef.b*power(t,koef.k))*m)+ch);

while (t<p[length(p)-1].x) do

begin

x:=round(t*m)+cw;

y:=-round((koef.b*power(t,koef.k))*m)+ch;

lineTo(x,y);

t:=t+0.1;

end;//while

end;//fnPower

fnExp:

begin

pen.Color:=colorBox1.Selected;

t:=0;

moveTo(round(t*m)+cw,-round(koef.b*exp(t*koef.k)*m)+ch);

while (t<p[length(p)-1].x) do

begin

x:=round(t*m)+cw;

y:=-round(koef.b*exp(t*koef.k)*m)+ch;

lineTo(x,y);

t:=t+0.1;

end;//while

end;//fnExp

fnDrLine:

begin

pen.Color:=colorBox1.Selected;

t:=p[0].x;

moveTo(round(t*m)+cw,-round(1/(koef.k*t+koef.b)*m)+ch);

while (t<p[length(p)-1].x) do

begin

if (abs(koef.k*t+koef.b)>=0.001) then

begin

x:=round(t*m)+cw;

y:=-round(1/(koef.k*t+koef.b)*m)+ch;

lineTo(x,y);

end

else

begin

x:=round((t+0.1)*m)+cw;

y:=-round(1/(koef.k*(t+0.1)+koef.b)*m)+ch;

moveTo(x,y);

end;

t:=t+0.1;

end;//while

end;//fnDrLine;

fnDrRac:

begin

pen.Color:=colorBox1.Selected;

t:=p[0].x;

moveTo(round(t*m)+cw,-round(t/(koef.b*t+koef.k)*m)+ch);

while (t<p[length(p)-1].x) do

begin

if (abs(koef.k*t+koef.b)>=0.001) then

begin

x:=round(t*m)+cw;

y:=-round(t/(koef.b*t+koef.k)*m)+ch;

lineTo(x,y);

end

else

begin

x:=round((t+0.1)*m)+cw;

y:=-round((t+0.1)/(koef.b*(t+0.1)+koef.k)*m)+ch;

moveTo(x,y);

end;

t:=t+0.1;

end;//while

end;//fnDrLine;;

fnPolinom:

begin

pen.Color:=colorBox1.Selected;

t:=p[0].x;

moveTo(round(t*m)+cw,-round(F(polinom,t))+ch);

while (t<p[length(p)-1].x) do

begin

x:=round(t*m)+cw;

y:=-round(F(polinom,t)*m)+ch;

lineTo(x,y);

t:=t+0.1;

end;//while

end;//fnDrLine;

end;

end;

end;//with

end;

//считываем точки

procedure TForm1.Button1Click(Sender: TObject);

begin

if (OpenTextFileDialog1.Execute) then

begin

GetPointsOutFile(OpenTextFileDialog1.FileName);

bildFunction:=false;

paintBox1.Repaint;

end;

end;

procedure TForm1.GetPointsOutFile(path: string);

var f:TextFile;

x,y:extended;

str,str2,str3:string;

token:integer;

begin

try

listView1.Clear;

AssignFile(f,path);

Reset(f);

while (not eof(f)) do

begin

readln(f,str);

token:=Pos(' ',str);

str2:=copy(str,1,token-1);

str3:=copy(str,token+1,Length(str)-length(str2));

// заменяем точки на запятые для корректного конвертирования

token:=Pos('.',str2);

if (Token>0) then str2[token]:=',';

token:=Pos('.',str3);

if (Token>0) then str3[token]:=',';

x:=StrToFloat(str2);

y:=StrToFloat(str3);

listView1.Items.Add;

listView1.Items[listView1.Items.Count-1].Caption:=str2;

listView1.Items[ListView1.Items.Count-1].SubItems.add(str3);

end;

except

on EConvertError do ShowMessage('Неверный формат данных');

on EFileNotFoundException do ShowMessage('Файл не найден');

on EInOutError do ShowMessage('Выбран не верный файл');

end;

closeFile(f);

end;

procedure swapLine(Sys:Tmatrix; a,b:integer);

var i:integer;

buf:extended;

begin

for i:= 0 to length(sys[0]) - 1 do

begin

buf:=sys[a,i];

sys[a,i]:=sys[b,i];

sys[b,i]:=buf;

end;

end; //SwapLine

function TForm1.SolveGauss(matrix:TMatrix):Tmas;

var answer:Tmas;

i,j,k,a,b,L1,L2:integer;

buf,max:extended;

begin

a:=Length(matrix);

b:=Length(matrix[0]);

//приводим матрицу к диаганальному виду

for I:= 0 to a-2 do

begin

L1:=i;

L2:=i;

max:=abs(matrix[i,i]);

for j:= i to a -1 do

if (abs(matrix[j,i])>max) then

begin

max:=abs(matrix[j,i]);

L2:=j;

end;

if (L1<>L2) then swapLine(matrix,L1,L2);

for j:= i+1 to a - 1 do

begin

buf:= matrix[j,i]/matrix[i,i];

for k:= i to b - 1 do

matrix[j,k]:=matrix[j,k]-buf*matrix[i,k];

end;//end for j

end; //end for i

SetLength(answer,a);

//вычитываем ответы

for I:= a-1 downto 0 do

begin

buf:=matrix[i,b-1];

for j:= b-2 downto i+1 do buf:=buf-matrix[i,j]*answer[j];

answer[i]:=buf/matrix[i,i];

end;//end for i

result:=answer;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

PaintBox1.Repaint;

end;

end.

Приложение Б (обязательное)

Руководство пользователя

Описание программы:

Данная программа предназначена для нахождения аппроксимирующих кривых функции заданной таблично.

Виды аппроксимирующих кривых: многочлен, прямая, степенная функция, экспонента, дробно-линейная функция, дробно-рациональная функция.

Системные требования:

Процессор: 800 МГц и выше.

Операционная система: Windows XP и выше.

Стартовое окно программы изображено на рисунке Б.1.

Рисунок Б.1 - Стартовое окно программы

Получение набора точек.

Для того чтобы получить набор точек, необходимо нажать кнопку «Считать точки», после чего в появившемся окне выбрать файл с точками.

Выбор типа аппроксимирующей прямой и выполнение расчетов.

Для того чтобы выполнить посторенние приближения, необходим в списке, обозначенном на рисунке Б.2 выбрать тип кривой, после чего нажать кнопу «Выполнить расчет». Если в качестве кривой, выбран полином, то также необходимо в поле «Максимальная степень полинома» ввести неотрицательное целое число, показывающее, полином какой степени необходимо построить.

Рисунок Б.2 - Выбор аппроксимирующей кривой

Результаты вычислений.

Результаты вычислений буду отражены в полях «Получившаяся зависимость» и «Сумма отклонений». В поле «Получившаяся зависимость» будет выведенная аппроксимирующая функция, в поле «Сумма отклонений», будет выведенная сумма квадратов отклонений кривой от функции.

Графическое представление результатов и управление им.

Графическое представление результата будет выведено в поле, выделенном на рисунке Б.3.

Рисунок Б.3 - Аппроксимирующая кривая

Если щелкнуть мышью в любое место графика, то начало координат будет принесено в данное место.

Масштабирование осуществляется придвижением ползунка «Zoom» вправо и влево.

Изменить цвет кривой можно, выбрав в списке «Цвет кривой» любой цвет.

Размещено на Allbest.ru


Подобные документы

  • Постановка задачи аппроксимации методом наименьших квадратов, выбор аппроксимирующей функции. Общая методика решения данной задачи. Рекомендации по выбору формы записи систем линейных алгебраических уравнений. Решение систем методом обратной матрицы.

    курсовая работа [77,1 K], добавлен 02.06.2011

  • Преобразование коэффициентов полиномов Чебышева. Функции, применяемые в численном анализе. Интерполяция многочленами, метод аппроксимации - сплайн-аппроксимация, ее отличия от полиномиальной аппроксимации Лагранжем и Ньютоном. Метод наименьших квадратов.

    реферат [21,5 K], добавлен 27.01.2011

  • Изучение аппроксимации таблично заданной функции методом наименьших квадратов при помощи вычислительной системы Mathcad. Исходные данные и функция, вычисляющая матрицу коэффициентов систему уравнений. Выполнение вычислений для разных порядков полинома.

    лабораторная работа [166,4 K], добавлен 13.04.2016

  • Особенности метода аппроксимации табулированных функций. Рассмотрение преимуществ работы в среде математической программы Mathcad. Метод наименьших квадратов как наиболее распространенный метод аппроксимации экспериментальных данных, сферы применения.

    курсовая работа [1,2 M], добавлен 30.09.2012

  • Вероятностное обоснование метода наименьших квадратов как наилучшей оценки. Прямая и обратная регрессии. Общая линейная модель. Многофакторные модели. Доверительные интервалы для оценок метода наименьших квадратов. Определение минимума невязки.

    реферат [383,7 K], добавлен 19.08.2015

  • Интерполяция (частный случай аппроксимации). Аппроксимация функцией. Метод наименьших квадратов. Из курса математики известны 3 способа задания функциональных зависимостей: аналитический, графический, табличный.

    реферат [70,4 K], добавлен 26.05.2006

  • Исследование вопросов построения эмпирических формул методом наименьших квадратов средствами пакета Microsoft Excel и решение данной задачи в MathCAD. Сравнительная характеристика используемых средств, оценка их эффективности и перспективы применения.

    курсовая работа [471,3 K], добавлен 07.03.2015

  • Аппроксимация и теория приближений, применение метода наименьших квадратов для оценки характера приближения. Квадратичное приближение таблично заданной функции по дискретной норме Гаусса. Интегральное приближение функции, которая задана аналитически.

    реферат [82,0 K], добавлен 05.09.2010

  • Непрерывная и точечная аппроксимация. Интерполяционные полиномы Лагранжа и Ньютона. Погрешность глобальной интерполяции, квадратичная зависимость. Метод наименьших квадратов. Подбор эмпирических формул. Кусочно-постоянная и кусочно-линейная интерполяции.

    курсовая работа [434,5 K], добавлен 14.03.2014

  • Основные задачи регрессионного анализа в математической статистике. Вычисление дисперсии параметров уравнения регрессии и дисперсии прогнозирования эндогенной переменной. Установление зависимости между переменными. Применение метода наименьших квадратов.

    презентация [100,3 K], добавлен 16.12.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.