Файл: Аппроксимация выборки случайных чисел методом наименьших квадратов.doc

Добавлен: 29.10.2018

Просмотров: 276

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Аппроксимация выборки случайных чисел методом наименьших квадратов


Пусть надо аппроксимировать случайную выборку значений fi в точках xi. Если предполагается, что вид нашей выборки приблизительно линейный, то в качестве аппроксимационной зависимости можно выбрать линейную функцию y = a*x + b.

Получим коэффициенты a и b методом наименьших квадратов.


Запишем сумму квадратов отклонений нашей функции fi от аппроксимационных значений yi = a*xi + b

(1)

Сумма квадратов отклонений S зависит от коэффициентов a и b. Нам необходимо найти такие а и b, при которых S минимально. Запишем условия минимума функции S(a,b) по переменным a и b:

, (2)

Из условий (2) следуют два уравнения на коэффициенты a, b.

(3)

(4)

Из системы (3), (4) легко получить значения коэффициентов a и b.


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

  1. Задаем начальные данные для аппроксимации: границы отрезка x0 и xn, количество узлов координатной сетки n, шаг сетки h, массив значений координат сетки z(n) и массив значений выборки случайных чисел f(n).

  2. Графически изображаем выборки случайных чисел f(n) на отрезке от x0 до xn с шагом sh.

  3. Задаем нулевые значения вспомогательным переменным s1=0, s2=0 s3=0 s4=0 s5=0.

  4. Задаем цикл по i от 1 до n.

  5. Вычисляем в цикле s1=s1+x(i)^2; s2=s2+x(i); s3=s3-f(i)*x(i); s5=s5-f(i).

  6. Конец цикла по i.

  7. Задаем s4=s2.

  8. Вычисляем коэффициенты прямой a и b: a=-(s3/s2-s5/n)/(s1/s2 -s4/n) и b=-s3/s2-a*s1/s2.

  9. Вычисляем значение аппроксимирующей прямой в точках x0 и xn: f1=a*x0+b и f2=a*xn+b.

  10. Графически изображаем аппроксимирующую прямую.

  11. Выводим на экран значения коэффициентов прямой a и b.

  12. Конец программы.


Пример реализации линейной аппроксимации выборки случайных чисел методом наименьших квадратов на VFP:


SET DECIMALS TO 10

n=100

DIMENSION f(n),z(n)

h=0.1


FOR i=1 TO n

z(i)=(i-1)*h

x=z(i)

f(i)= func1(x)

ENDFOR


x0=0.05

xn=2



sh=0.05


x1=x0

f1 = func1(x1)


_screen.Cls


FOR x=x0 TO xn STEP sh

x2=x+sh

f2 = func1(x2)

_screen.Line(xe(x1),ye(f1),xe(x2),ye(f2))

x1=x2

f1=f2

ENDFOR


a=0

b=0

метод_наименьших_квадратов(@f,@z,n,@a,@b)


f1=a*x0+b

f2=a*xn+b


_screen.Line(xe(x0),ye(f1),xe(xn),ye(f2))


? a,b


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

PARAMETERS f,x,n,a,b

s1=0

s2=0

s3=0

s4=0

s5=0


FOR i=1 TO n

s1=s1+x(i)^2

s2=s2+x(i)

s3=s3-f(i)*x(i)

s5=s5-f(i)

ENDFOR


s4=s2

a=-(s3/s2-s5/n)/(s1/s2 -s4/n)

b=-s3/s2-a*s1/s2

RETURN



FUNCTION func1

PARAMETERS x

RETURN 2*x+0.5+0.4*RAND()



FUNCTION xe

PARAMETERS x

RETURN 50 + x*400


FUNCTION ye

PARAMETERS y

RETURN 400 - y*150



Данная реализация алгоритма для графического изображения значений выборки случайных чисел f(x) и аппроксимирующей прямой использует метод line(x1,y1,x2,y2) объекта _screen.



Пример реализации линейной аппроксимации выборки случайных чисел методом наименьших квадратов на VBA:

Sub MNK_Test()

Dim f(100), z(100)


Set xlSheet = Application.ActiveSheet


n = 100

h = 0.1


For i = 1 To n

z(i) = (i - 1) * h

x = z(i)

f(i) = func1(x)

Next i


x1 = 0.05

f1 = func1(x1)

sh = 0.05

xlSheet.Cells(1, 1).Value = x1

xlSheet.Cells(1, 2).Value = f1

i = 1

For x = 0.05 To 2 Step sh

i = i + 1

x1 = x + sh

f1 = func1(x1)

xlSheet.Cells(i, 1).Value = x1

xlSheet.Cells(i, 2).Value = f1

Next x


a = 0

b = 0


MNK f, z, n, a, b


x1 = 0.05

f2 = a * x1 + b

xlSheet.Cells(1, 3).Value = f2


i = 1

For x = 0.05 To 2 Step sh

i = i + 1

f2 = a * x + b

xlSheet.Cells(i, 3).Value = f2

Next x



Debug.Print "a= " & Format(a, "00.000 000 000") & " : b= " & Format(b, "00.000 000 000")


Call AddChart("C1", "C2", "C3")


End Sub



Sub MNK(fd, xd, n, a, b)


s1 = 0

s2 = 0

s3 = 0

s4 = 0

s5 = 0


For i = 1 To n

s1 = s1 + xd(i) ^ 2

s2 = s2 + xd(i)

s3 = s3 - fd(i) * xd(i)

s5 = s5 - fd(i)

Next i


s4 = s2


a = -(s3 / s2 - s5 / n) / (s1 / s2 - s4 / n)

b = -s3 / s2 - a * s1 / s2


End Sub



Function func1(x)

func1 = 2 * x + 0.5 + 0.4 * Rnd()

End Function


Sub AddChart(Col1, Col2, Col3)

ASheetName = Application.ActiveSheet.Name

Charts.Add

ActiveChart.ChartType = xlXYScatterSmooth

' ActiveChart.SetSourceData Source:=Sheets(ASheetName).Range("A1")

ActiveChart.SeriesCollection.NewSeries

ActiveChart.SeriesCollection.NewSeries

ActiveChart.SeriesCollection(1).XValues = "=" & ASheetName & "!" & Col1

ActiveChart.SeriesCollection(1).Values = "=" & ASheetName & "!" & Col2

ActiveChart.SeriesCollection(1).Name = "=""f(x)"""

ActiveChart.SeriesCollection(2).XValues = "=" & ASheetName & "!" & Col1

ActiveChart.SeriesCollection(2).Values = "=" & ASheetName & "!" & Col3

ActiveChart.SeriesCollection(2).Name = "=""g(x)"""

ActiveChart.Location Where:=xlLocationAsObject, Name:=ASheetName

ActiveChart.SeriesCollection(2).ChartType = xlXYScatterSmoothNoMarkers

ActiveChart.SeriesCollection(1).Select

ActiveChart.ChartArea.Select

End Sub


В данной реализации для графического изображения значений выборки случайных чисел f(x) и аппроксимирующей прямой (g(x)) используются средства построения графиков MS EXCEL. Значения x , f(x) и g(x) заносятся в ячейки первых трех колонок рабочего листа:

xlSheet.Cells(i, 1).Value = x1

xlSheet.Cells(i, 2).Value = f1

xlSheet.Cells(i, 3).Value = g1

и в конце программы для построения графика вызывается метод AddChart(Col1, Col2, Col3).