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

Вниз

Как построить график апроксимации   Найти похожие ветки 

 
Zvr@b ©   (2004-02-17 17:57) [0]

Уважаемые мастера, как мне построить график, имея лишь 6-10 точек? Понятно, что нужно апроксимировать, но вот как? и как потом ввывести этот график в Chart? А может есть какая компонента, которая проста сгладит мне эту ломанную кривую и всё? Подскажите!


 
Pat ©   (2004-02-17 18:12) [1]

Аппроксимация полиномом 3-ей степени.
Дана таблица зависимости y=f(x) (пофиг сколько значений). Надо аппроксимировать полиномом 3-ей степени т.е. должны получить функцию вида y=a0+a1*x+a2*x^2+a3*x^3

Sys=array [1..4,1..5] of double;//Система (расширенная матрица)
Resh=array [1..4] of double;//Решение этой самой системы
............................
//Решение системы методом Гаусса
function Gauss(a:Sys;n:word):resh;
var i,j,k:integer;
b:double;
begin
for k:=1 to n do
for i:=k+1 to n do
begin {исключаем неизвестные}
b:=a[i,k];
for j:= k to n+1 do
a[i,j]:=a[k,k]*a[i,j]-a[k,j]*b;
end;

for i:=n downto 1 do
begin
for j:= n downto i+1 do
a[i,n+1]:=a[i,n+1]-result[j]*a[i,j]; {Нахождение неизвестных без проверки на БМР}
result[i]:=a[i,n+1]/a[i,i];
end;

end;


Процедура вычисления коэффициентов полинома

procedure GetPolinom;
var i,j,k:integer;
x:sys;
a:resh;
begin
for i:=1 to 4 do
for j:=1 to 5 do
x[i,j]:=0;

for i:=1 to 4 do a[i]:=0;

{К-ты полинома для мат. ожидания}
for i:=1 to 4 do
begin
for j:=1 to 4 do {Матрица системы}
for k:=1 to MainForm.speSGRows.Value do
x[i,j]:=x[i,j]+power(strtofloat(MainForm.SG.cells[0,k]),i+j-2);
end;

for i:=1 to 4 do
for k:=1 to MainForm.speSGRows.Value do
x[i,5]:=x[i,5]+
strtofloat(MainForm.SG.cells[1,k])* {Вектор свободных к-тов}
power(strtofloat(MainForm.SG.cells[0,k]),i-1);

a:=Gauss(x,4);
//А это сами решения. Переменные a0..a3 описываются как глобальные, тип double
a0:=a[1];
a1:=a[2];
a2:=a[3];
a3:=a[4];
end;


Со всеми непонятками - в мыло.


 
pasha_golub ©   (2004-02-17 18:31) [2]

Zvr@b © (17.02.04 17:57)

Аппроксимация или интерполяция?


 
Zvr@b ©   (2004-02-17 18:44) [3]

Мне важен результат! Нужно получить наглядный рисунок! А значения функции фиг с ними, только вид графика (а не ломаной прямой).


 
olookin ©   (2004-02-17 18:47) [4]

Приближение полиномом произвольной степени

procedure PolynomialRegression(ValueArray,ArgumentArray: TDoubleArray;
SourceSeries: PChartSeries; var DestSeries: PChartSeries;
PolyDegree: integer; var ArrayCoefs: PDoubleArray; SeriesColor: TColor;
var Hint: PChar); register;
var bcoef,dcoef: TDoubleArray;
ccoef: TExDoubleArray;
i,j,k,N: integer;
polynom: double;
s: string;
begin
if ValueArray<>nil then N:=Length(ValueArray) else
N:=SourceSeries^.XValues.Count; Hint:=""; rv:=nil;
if N>PolyDegree then begin SetLength(ccoef,PolyDegree+1);
for i:=0 to Length(ccoef)-1 do SetLength(ccoef[i],PolyDegree+1);
SetLength(dcoef,PolyDegree+1); SetLength(bcoef,PolyDegree+1);
for i:=0 to Length(dcoef)-1 do begin dcoef[i]:=0;
for j:=0 to N-1 do begin if ValueArray<>nil then dcoef[i]:=dcoef[i]+
Power(ArgumentArray[j],i)*ValueArray[j] else
dcoef[i]:=dcoef[i]+Power(SourceSeries^.XValues.Value[j],i)*
SourceSeries^.YValues.Value[j]; end;
for j:=0 to Length(ccoef)-1 do begin ccoef[i][j]:=0;
for k:=0 to N-1 do begin if ValueArray<>nil then ccoef[i][j]:=
ccoef[i][j]+Power(ArgumentArray[k],i+j) else
ccoef[i][j]:=ccoef[i][j]+Power(SourceSeries^.XValues.Value[k],i+j);
end; end; end;
for i:=0 to Length(ccoef)-2 do for j:=i+1 to Length(ccoef)-1 do begin
ccoef[j][i]:=-ccoef[j][i]/ccoef[i][i];
dcoef[j]:=dcoef[j]+ccoef[j][i]*dcoef[i];
for k:=i+1 to Length(ccoef)-1 do
ccoef[j][k]:=ccoef[j][k]+ccoef[j][i]*ccoef[i][k]; end;
bcoef[Length(bcoef)-1]:=dcoef[Length(dcoef)-1]/
ccoef[Length(bcoef)-1][Length(bcoef)-1];
for i:=Length(ccoef)-2 downto 0 do begin
for j:=i+1 to Length(ccoef)-1 do bcoef[i]:=bcoef[i]+bcoef[j]*ccoef[i][j];
bcoef[i]:=(dcoef[i]-bcoef[i])/ccoef[i][i]; end;
SetLength(rv,Length(bcoef));
for i:=0 to Length(bcoef)-1 do rv[i]:=bcoef[i];
if TChartSeries(DestSeries)<>nil then for i:=0 to N-1 do begin polynom:=0;
if ValueArray<>nil then begin
for j:=0 to PolyDegree do polynom:=polynom+bcoef[j]*Power(ArgumentArray[i],j);
DestSeries^.AddXY(ArgumentArray[i],polynom,"",SeriesColor); end else begin
for j:=0 to PolyDegree do polynom:=polynom+
bcoef[j]*Power(SourceSeries^.XValues.Value[i],j);
DestSeries^.AddXY(SourceSeries^.XValues.Value[i],
polynom,"",SeriesColor); end; end; s:="";
for j:=PolyDegree downto 0 do
s:=s+Format("%0.3f",[bcoef[j]])+"*X^"+IntToStr(j);
Hint:=PChar(s); ArrayCoefs:=PDoubleArray(@rv);
dcoef:=nil; bcoef:=nil; ccoef:=nil; end;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
14-94123
Думкин
2004-02-08 06:35
2004.02.29
С днем рождения! 8 февраля.


14-94128
Ega23
2004-02-09 10:34
2004.02.29
Programming Windows Driver Model


1-93941
NetworK
2004-02-17 14:46
2004.02.29
PDF и компоненты для его просмотра


1-93991
Vitaliygavrilov
2004-02-16 10:20
2004.02.29
Подскажите как сделать локальный браузер (вне сети)


4-94230
DelphiN!
2003-12-20 20:34
2004.02.29
Как послать сообщение открытому в данный момент окну