Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
6-86475
Vin
2003-10-23 12:40
2003.12.26
Как поместить на форму картинку из Html странички


3-86268
ki11er
2003-12-03 14:12
2003.12.26
Как записать запрос в таблицу?


3-86267
Andriy Tysh
2003-12-03 10:29
2003.12.26
Master-Detail


3-86269
_jek
2003-12-01 13:23
2003.12.26
ADO и процедура в ACCESS


1-86413
Jenaxx
2003-12-13 17:43
2003.12.26
Скажите как просто сгенерировать случайное число





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский