Форум: "Потрепаться";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизМетод наименьших квадратов Найти похожие ветки
← →
Pat (2003-12-03 17:33) [0]Аппроксимация функции полиномом 3-ей степени по методу наименьших квадратов состоит в нахождении коэффициентов a0,a1,a2,a3, таких, что
SUM(i=1,k)[sqr(S(ti)-(a0+a1*t+a2*t^2+a3*t^3))]=min (минимизируется сумма квадратов), где S(t1) – значение функции в данной точке ti.
Пример:
T1=0 S(t1)=0.02471
T2=500 S(t2)=0.02482
T3=1000 S(t3)=0.02504
T4=2000 s(t4)=0.02549
T5=5000 S(t5)=0.02660
T6=10000 S(t6)=0.02881
T7=15000 S(t7)=0.03162
T8=20000 S(t8)=0.03606
Sqr(0.02471-(a0+a1*0+a2*0+a3*0))+Sqr(0.02482-(a0+a1*500+a2*500^2+a3*500^3))+Sqr(0.02504-(a0+a1*1000+a2*1000^2+a3*1000^3) )+Sqr(0.02549-(a0+a1*2000+a2*2000^2+a3*2000^3))+Sqr(0.02660-(a0+a1*5000+a2*5000^2+a3*5000^3))+Sqr(0.02881-(a0+a1*10000+a 2*10000^2+a3*10000^3))+Sqr(0.03162-(a0+a1*15000+a1*15000^2+a3*15000^3))+Sqr(0.03606-(a0+a1*20000+a2*20000^2+a3*20000^3)) =min
Решая всю эту бодягу, получим:
A0=2.4674*10^-2
A1=3.9734*10^-7
A2=7.3293*10^-12
A3=9.2243*10^-16
Итого:
S(t)=2.4674*10^-2+3.9734*10^-7*t-7.3293*10^-12*t^2+9.2243*10^-16*t^3
Внимание вопрос: есть ли какой-либо численный метод для нахождения a0,a1,a2,a3 из выражения для минимизации?
Пробовал брать только 4 точки и решать систему уравнений 4х4, но проблема в том, что может вводиться сколько угодно значений функции
← →
pasha_golub (2003-12-03 17:41) [1]На этот счет (если точек много) лучше пользоваться сплайнами, апроксимация будет гораздо точнее.
Ну, а на вопрос ответ находится в книжке по чис. методам, и искать его надо там.
← →
Думкин (2003-12-03 17:43) [2]Минимум функции 4-х переменных. В чем проблема?
← →
nikkie (2003-12-03 17:43) [3]количество точек не важно. стоит задача нахождения минимума функции F(a0,a1,a2,a3), а в минимуме частные производные должны обращаться в ноль. при любом количестве точек получаем 4 линейных уравнения на 4 переменные.
← →
MBo (2003-12-03 18:20) [4]Писал процедуру сначала на Фортране, уши торчат ;))
procedure plap(ry:array of double;np,i1p,i2p:integer;var sx:mas10);
//np-степень, i1p, i2p - нач. и конеч. точки
procedure plap;
var
ap: array[1..10, 1..10] of double;
bp: array[1..10] of double;
cp: array[1..20] of double;
mfp, j, k, ii, i: integer;
h, x, y, hp, f: double;
begin
hp := 0;
mfp := i2p - i1p + 1;
for i := 1 to 10 do begin
sx[i] := 0;
bp[i] := 0;
cp[2 * i] := 0;
cp[2 * i - 1] := 0;
end;
for i := 1 to 10 do begin
for j := 1 to 10 do
AP[i, j] := 0;
end;
for i := i1p to i2p do begin
X := i;
y := ry[i - 1];
f := 1;
for j := 1 to 2 * np - 1 do begin
if j <= np then begin
bp[j] := bp[j] + y;
y := y * X
end;
cp[j] := cp[j] + f;
f := f * X;
end;
end;
for i := 1 to np do begin
K := i;
for j := 1 to np do begin
AP[i, j] := cp[K];
K := K + 1;
end;
end;
for i := 1 to np - 1 do begin
for j := i + 1 to np do begin
AP[j, i] := -AP[j, i] / AP[i, i];
for K := i + 1 to np do
AP[j, K] := AP[j, K] + AP[j, i] * AP[i, K];
bp[j] := bp[j] + AP[j, i] * bp[i];
end;
end;
sx[np] := bp[np] / AP[np, np];
for ii := 1 to np - 1 do begin
i := np - ii;
h := bp[i];
for j := i + 1 to np do
h := h - sx[j] * AP[i, j];
sx[i] := h / AP[i, i];
end;
end; {plap}
← →
Pat (2003-12-03 19:38) [5]>MBo © (03.12.03 18:20)
А можно переменные расшифровать? :-)
← →
Юрий Зотов (2003-12-03 22:16) [6]> Pat
Обратите внимание на [3].
Если учесть, что в минимуме все частные производные должны обращаться в ноль, то становится ясно, что задача аппроксимации по МНК всегда, при любом количестве точек сводится к решению системы линейных уравнений. А методы решения таких систем хорошо известны - например, метод Гаусса.
Например, пусть у нас есть N точек (X1,Y1)...(XN, YN). Построим аппроксимирующую прямую. Она имеет уравнение AX+B и нам надо найти A и B из условия минимума функции 2-х переменных:
S(A,B) = SUM(i=1..N)[(AXi+B-Yi)^2]
Приравняем нулю частную производную dS/dA:
SUM(i=1..N)[2*(A*Xi+B-Yi)*Xi] = 0
После упрощений получаем уравнение:
A*SUM(i=1..N)[Xi^2] + B*SUM(i=1..N)[Xi] = SUM(i=1..N)[Xi*Yi];
(причем заметьте, что все суммы здесь - это известные числа, а неизвестны только A и B).
Проделав то же самое с частной производной dS/dB, получаем второе уравнение c теми же неизвестными A и B:
A*SUM(i=1..N)[Xi] + B*N = SUM(i=1..N)[Yi];
И все. Решаем два линейных уравнения с двумя неизвестными (например, тем же методом Гаусса) и в итоге получаем A и B.
Почему здесь было 2 уравнения? Только потому, что мы аппроксимировали точки прямой линией. Но совершенно тот же самый аппарат используется и при аппроксимации любым другим полиномом (конечно, его степень K должна быть не выше N-1, иначе это будет уже не аппроксимация, а интерполяция). Составляем целевую функцию, берем частные производные от нее по каждому коэффициенту, приравниваем их нулю - и всегда получаем систему K линейных уравнений с К неизвестными. Решаем - и находим все K коэффициентов аппроксимируюшего полинома.
Уф-ф-ф...
:о)
← →
Pat (2003-12-04 00:52) [7]Всем спасибо за участие. Решил через частные производные :-)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c