К списку форумов К списку вопросов
Апроксимация функции. Подскажите как...
Иешуа
22.09.2004 - 14:03
Значится так! есть набор точек от 1 до бесконечности с соотетствующими аргументами (табличка с "х" и "у"). Нужно все свести к формле, те апроксимировать эту кривую. По виду она очень похожа на гиперболу, но можно и приведением к ряду...
Короче, нужно формула для апроксимации функции!!!
Заранее Всем спасибо!!
Наф
1 - 22.09.2004 - 14:22
Апросимация рядом...
не это истина где-то рядом, а апроксимация многочленом (усеченным рядом). Пусть n точек.
Есть многочлен a(n-1)*x^(n-1)+...+a(1)*x+a(0)
подставлеям 1 точку:
a(n-1)*x[1]^(n-1)+...+a(1)*x[1]+a(0)=y[1]
и т.д.
a(n-1)*x[n]^(n-1)+...+a(1)*x[n]+a(0)=y[n]
Получаем систему уравнений относительно a(n-1),...,a(0). Решаем, находим многочлен. Все.
RTFM
2 - 22.09.2004 - 16:33
Очень рекомендуй сайты
http://algolist.manual.ru/
http://alglib.manual.ru/
Не помню на каком из них (скорее на втором) изложены несколько методов апроксимации. Т.е. алгоритм и исходники ))
Посторонним В
3 - 22.09.2004 - 22:08
Не поленился, достал из архива 3 курса. Аппроксимация методом наименьших квадратов. Паскаль. Тухлыми яблоками не кидать, знаю, что хуже сделать было нельзя, писал и отлаживал на бумаге за отсутствием компа ;-)
Program approximation;
uses crt;const n=5;l=15; {n=числу полиномиальных коэффициентов}
                {l=числу исходных точек неизвестной функции y}
type tarr1=array[1..n] of real;
     tarr2=array[1..n,1..n] of real;
     tarrl=array[1..l] of real;
      tarr=array[0..n-1] of real;
var a:tarr2;
      b:tarr1;
      p:tarr;
  f,x,y:tarrl;
i,j,k,d:integer;
      v:tarr1;
   xv,z:real;
      h:string[1];
    fil:text;
function g(t:tarr;x1:real):real;
var i2:integer;
    w1:real;
begin
  w1:=0;
  for i2:=0 to n-1 do begin
    w1:=w1+t[i2]*exp(i2*ln(x1));
  end;
  g:=w1;
end;
function max(t1:tarrl):real;
var i3:integer;
     w:real;
begin
 w:=t1[1];
 for i3:=2 to l do
   if t1[i3] > w then w:=t1[i3];
 max:=w;
end;
procedure writing(c1:tarr2;c2:tarr1);
var i4,j4:integer;
begin
  for i4:=1 to n do begin
    for j4:=1 to n do
      write(' ',c1[i4,j4]:10:3,' ');
    write(' | ',c2[i4]:4:4);
  writeln;
  end;
end;
                  {=======Основной блок=========}
Begin
        {абсциссы точек}
  x[1]:=0.1;x[2]:=1;x[3]:=3;x[4]:=5;x[5]:=10;x[6]:=15;x[7]:=20;x[8]:=25;
  x[9]:=30;x[10]:=35;x[11]:=40;x[12]:=50;x[13]:=60;x[14]:=80;x[15]:=100;
        {ординаты - табличные значения}
  y[1]:=0;y[2]:=0.2;y[3]:=1;y[4]:=2;y[5]:=5.5;y[6]:=9;y[7]:=12;y[8]:=14.3;
  y[9]:=16;y[10]:=17.2;y[11]:=18.1;y[12]:=19;y[13]:=19.5;y[14]:=19.8;y[15]:=20;
  z:=0;
  {заполняем матрицы коэффициентов для системы}
  for i:=1 to n do begin
    for j:=1 to n do begin
      for d:=1 to l do
        z:=z+exp((i+j-2)*ln(x[d]));
      a[i,j]:=z;z:=0;
    end;
    for d:=1 to l do
      z:=z+y[d]*exp((i-1)*ln(x[d]));
    b[i]:=z;z:=0;
  end;
  clrscr;
  writeln('расширенная матрица системы :');
  writing(a,b);
    i:=1;
    {решаем систему методом Гаусса. v - вектор неизвестных}
  repeat
    b[i]:=b[i]/a[i,i];
    for j:=n downto i do
      a[i,j]:=a[i,j]/a[i,i];
    for k:=i+1 to n do begin
      b[k]:=b[k]-b[i]*a[k,i];
      for j:=n downto i do
        a[k,j]:=a[k,j]-(a[i,j]*a[k,i]);
    end;
  i:=i+1;
  until i=n+1;
  v[n]:=b[n];
  for i:=n-1 downto 1 do begin
    v[i]:=b[i];
    for j:=i+1 to n do
      v[i]:=v[i]-(v[j]*a[i,j]);
  end;
  for i:=1 to n do p[i-1]:=v[i];
  writeln;
  writeln('эквивалентная ступенчатая матрица системы:');
  writing(a,b);
  writeln(' РЕШЕНИЕ : ');
  for d:=0 to n-1 do writeln(p[d]:12:10);
  writeln('значения аппроксимирующего полинома в узловых точках равны: ');
  for d:=1 to l do begin
    f[d]:=abs((g(p,x[d])-y[d])/{y[d]}6);
    write(' ',g(p,x[d]):4:2,' ');
    end;
  writeln;
  writeln('приведенная ошибка аппроксимации в % равна:');
  writeln(max(f)*100:4:0,'%');
{=====запись в файл=====}
  assign(fil,'result.txt');
  rewrite(fil);
  for d:=0 to n-1 do
    writeln (fil,p[d]);
End.
Посторонним В
4 - 22.09.2004 - 22:11
Там, где будет большими буквами РЕШЕНИЕ - это будут коэффициенты аппроксимирующего полинома. По возрастанию степени или по убыванию - не помню ;-)
archimag
5 - 22.09.2004 - 22:48
Не люблю многочлены, предпочитаю использовать кубические сплайны и всем советую :) Код приводить не буду, но могу выслать, правда он на С++...

К списку вопросов на форуме Программирование

>>