Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизКак построить график апроксимации Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c