![]() |
![]() |
Иешуа 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 | Не люблю многочлены, предпочитаю использовать кубические сплайны и всем советую :) Код приводить не буду, но могу выслать, правда он на С++... |