Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-93770
Шоломицкий
2004-02-04 11:41
2004.02.29
Как связать ADOConnection


1-93859
BALU1111
2004-02-16 16:17
2004.02.29
Окно в окне.


3-93783
Goida
2004-02-03 17:50
2004.02.29
Нужент TDBTreeView!!! Помогите!


3-93785
Piter
2004-02-01 21:05
2004.02.29
Упорядочивание в базе данных


8-94033
Вера
2003-10-29 11:35
2004.02.29
Image





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский