Файл: Аппроксимация выборки случайных чисел методом наименьших квадратов.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.
Пример алгоритма аппроксимации выборки случайных чисел методом наименьших квадратов на естественном языке:
-
Задаем начальные данные для аппроксимации: границы отрезка x0 и xn, количество узлов координатной сетки n, шаг сетки h, массив значений координат сетки z(n) и массив значений выборки случайных чисел f(n).
-
Графически изображаем выборки случайных чисел f(n) на отрезке от x0 до xn с шагом sh.
-
Задаем нулевые значения вспомогательным переменным s1=0, s2=0 s3=0 s4=0 s5=0.
-
Задаем цикл по i от 1 до n.
-
Вычисляем в цикле s1=s1+x(i)^2; s2=s2+x(i); s3=s3-f(i)*x(i); s5=s5-f(i).
-
Конец цикла по i.
-
Задаем s4=s2.
-
Вычисляем коэффициенты прямой a и b: a=-(s3/s2-s5/n)/(s1/s2 -s4/n) и b=-s3/s2-a*s1/s2.
-
Вычисляем значение аппроксимирующей прямой в точках x0 и xn: f1=a*x0+b и f2=a*xn+b.
-
Графически изображаем аппроксимирующую прямую.
-
Выводим на экран значения коэффициентов прямой a и b.
-
Конец программы.
Пример реализации линейной аппроксимации выборки случайных чисел методом наименьших квадратов на 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).