Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Аппроксимация данных в дельфи   Найти похожие ветки 

 
Andol   (2007-07-15 09:35) [0]

Добрый день! Мне на работе задали переделать программу из МаtLab в Дельфи.
Для аппроксимации в матлабе есть специальная функция polyfit
**************************************************
Синтаксис:

           p = polyfit(x, y, n)

Описание:

Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является строка p длины n +1, содержащая коэффициенты аппроксимирующего полинома.
***************************************************

Подскажите пожалуйста, как можно сделать аппроксимацию данных в дельфи? И можно ли вообще это сделать??? В качестве коэффицентов полинома p(x) у меня идет матрица KTG (содержит 5 значений в строку), в качестве p(y) - матрица MR (содержит 5 значений в строку), и n=2.


 
Kolan ©   (2007-07-15 09:54) [1]

> Подскажите пожалуйста, как можно сделать аппроксимацию данных
> в дельфи?

Вот то что ты выше описал(Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) &#133) вот это и сделай руками.


 
Andol   (2007-07-15 10:04) [2]

Гениально, что нет слов... кинь тогда пожалуйста кусок кода хотя бы, чтобы знать с чего и как начать...


 
Kolan ©   (2007-07-15 10:16) [3]

> знать с чего и как начать

Начать с того как это вообще делать, т.е. изучить МНК. А дальше будут вопросы задавай.

> Гениально

А ты думал что в языках общего назначения встроены такие спец функции?  МатЛаб — это спец инструмент для математиков в отличае от Delphi кототорый явл средой быстрой разработки программ. Их и сравнить нельзя — это разные вещи.

ЗЫ
 Кстати ты еще можешь найти в интернете готовый код&#133


 
Ricks ©   (2007-07-17 12:54) [4]

Надо действительно сначала почитать МНК. Но если так уж не можешь - то вот тебе кусок кода:

type
TPointA = record
 t: single;
 x: single;
end;
TSystem4x4 = array [1..4, 1..5] of single;
TVector4   = array [1..4] of single;

var
c_system : TSystem4x4;
c_i      : TVector4;
src_pt  : array [0..pred(num_pts)] of TPointA =
 (
   (t: 0.0; x: -60),
   (t: 0.5; x: -70),
   (t: 1.0; x: -80),
   (t: 1.5; x: -88),
   (t: 2.0; x: -94),
   (t: 2.5; x:-100),
   (t: 3.0; x:-103),
   (t: 3.5; x:-103),
   (t: 4.0; x:-100),
   (t: 4.5; x: -94),
   (t: 5.0; x: -84),
   (t: 5.5; x: -72),
   (t: 6.0; x: -60),
   (t: 6.5; x: -50),
   (t: 7.0; x: -42),
   (t: 7.5; x: -36),
   (t: 8.0; x: -24),
   (t: 8.5; x: -20),
   (t: 9.0; x: -20),
   (t: 9.5; x: -24),
   (t:10.0; x: -30)
);

function pw(v : single; p : integer):single;
var R : single;
   u : integer;
begin
R:=1;
if p = 0 then begin
 Result:=R;
 Exit;
end;

for u:=1 to p do
 R:=R * v;
Result:=R;
end;

function SumT_i( p : integer ) : single;
var u : integer;
   S : single;
begin
S:=0;
for u:=0 to pred(num_pts) do
 S:=S + pw( src_pt[u].t, p );
Result:=S;
end;

function SumX_i( tiP : integer ) : single;
var u : integer;
   S : single;
begin
S:=0;
for u:=0 to pred(num_pts) do
 S:=S + src_pt[u].x * pw( src_pt[u].t, tiP );
Result:=S;
end;

procedure TMainForm.BuildSystem;
begin
c_system[1, 1]:=num_pts;
c_system[1, 2]:=SumT_i( 1 );
c_system[1, 3]:=SumT_i( 2 );
c_system[1, 4]:=SumT_i( 3 );
c_system[1, 5]:=SumX_i( 0 );
c_system[2, 1]:=SumT_i( 1 );
c_system[2, 2]:=SumT_i( 2 );
c_system[2, 3]:=SumT_i( 3 );
c_system[2, 4]:=SumT_i( 4 );
c_system[2, 5]:=SumX_i( 1 );
c_system[3, 1]:=SumT_i( 2 );
c_system[3, 2]:=SumT_i( 3 );
c_system[3, 3]:=SumT_i( 4 );
c_system[3, 4]:=SumT_i( 5 );
c_system[3, 5]:=SumX_i( 2 );
c_system[4, 1]:=SumT_i( 3 );
c_system[4, 2]:=SumT_i( 4 );
c_system[4, 3]:=SumT_i( 5 );
c_system[4, 4]:=SumT_i( 6 );
c_system[4, 5]:=SumX_i( 3 );
end;

procedure TMainForm.SolveSystemJG;
var i, j : integer;
   k    : integer;
   a, q : single;
begin
for i:=1 to 4 do begin
 a:=c_system[i, i];
 for j:=1 to 5 do
  c_system[i, j]:=c_system[i, j] / a;
 for k:=1 to 4 do begin
  if k = i then continue;
  q:=c_system[ k, i ];
  for j:=1 to 5 do
   c_system[ k, j ]:=c_system[ k, j ] - c_system[ i, j ] * q;
 end;
end;
c_i[1]:=c_system[1, 5];
c_i[2]:=c_system[2, 5];
c_i[3]:=c_system[3, 5];
c_i[4]:=c_system[4, 5];
end;


может так понятнее будет.....



Страницы: 1 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
2-1188629203
Человек
2007-09-01 10:46
2007.09.30
Файл Prn


2-1188652748
nil_pointer
2007-09-01 17:19
2007.09.30
Constant expression violates subrange bounds


2-1188719155
THandle
2007-09-02 11:45
2007.09.30
Проблема с чтением текста из TFileStream


1-1184613088
Lavrenty
2007-07-16 23:11
2007.09.30
Событие на обновление файла


2-1188978402
Смирнов
2007-09-05 11:46
2007.09.30
Запуздырить иконку в рей