Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [c++] Интерполяция


Автор: aneberne 12.4.2009, 18:30
Помогите пожалуйста, очень надо

http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D1%8F
http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D1%8F
http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BD%D0%BE%D0%BC_%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B0
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0

заранее благодарю)

upd или набросок дайте, если кто уже делал )) дальше поковыряюсь)

Автор: aneberne 13.4.2009, 04:18
прошу проверить ) или как-то упростить, если мона)

Лагранж
Код

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
float x[5] = {1, 2, 3, 4, 5}; 
float y[5] = {2, 3, 4, 5, 6}; 

/* Функция, вычисляющая коэффициенты Лагранжа
x - аргумент функции
n - степень многочлена (или число x-ов)
i - номер узла
*/

float L(float xp,int n,int i) {
// числитель и знаменатель 
float Chesl; 
float Znam;

Chesl = 1; Znam = 1;

int k;
// вычисление числителя
for (k = 0; k!= n; k++ ) {

if ( k == i ) continue; 
// убираем множитель x - x(i)
Chesl *= xp - x[k];
}
// вычисление знаменателя
for(k= 0; k!= n;k++) {

if (x[i] == x[k]) continue; 
// убираем, а то ноль в знаменателе

Znam *= x[i] - x[k];
}

return Chesl/Znam; 

}
int main(int argc, char* argv[])
{

// вычисляем степень полинома
int n = sizeof(y)/sizeof(float); 

// начальное значение 
float R = 0; 

// произвольная точка для проверки 
float px = 1;

// вычисляем значение интерполяционного многочлена

for (int i = 0; i != n; i++) { 

R += y[i]*L(px,n,i);
}

printf("Result : %f ",R);
    getch();

// вывод результата
return 0;
}


и Ньютон

Код

#include <stdio.h>
#include <conio.h>

main(void){
 const  int n = 5;
 double Xi[n] = {1,2,3,4,5};
 double Yi[n] = {2,3,4,5,6};
 double X = 0.1;
 double f, LN, XXX, XX=1.;
 int  i, j, k;

 for (i=1, LN=Yi[0]; i<n; i++)
 {
  XX *= (X-Xi[i-1]);
  for (j=0,f=0; j<=i; j++)
  {
   for (k=0,XXX=1.; k<=i; k++)
   {
    if (k!=j)
     XXX *= Xi[j]-Xi[k];
   }
   f += Yi[j]/XXX;
  }
  LN += XX * f;
 }
 printf("Y[X] = %g",LN);
 getch();
 
}

Автор: sentinel 26.4.2010, 21:39
Считается значение полинома в точке х, n - количество узлов интерполяции, x[j] - узлы интерполяции, y[j] - узловые значения.
При написании пользовалась http://www.cde.spbstu.ru/Num_Met/Interpol/newton_pol.html

Интерполяционный полином Лагранжа

Код

double Lagrange(double x){
    double F,res=0;
    for (int i=0;i<n;i++){
        F=1;
        for (int j=0;j<n;j++){
            if (i!=j) F*=(x-x[j])/(x[i]-x[j]);
        }
        res+=F*y[i];
    }
    return res;
}



Интерполяционный полином Ньютона (интерполяция вперед)

Код

double Newton_f(double x){
    double res=y[0],F,den;
    int i,j,k;
    for(i=1;i<n;i++){
        F=0;
        for(j=0;j<=i;j++){//следующее слагаемое полинома
            den=1;
//считаем знаменатель разделенной разности
            for(k=0;k<=i;k++){
                if (k!=j) den*=(x[j]-x[k]);
            }
//считаем разделенную разность
            F+=y[j]/den;
        }
//домножаем разделенную разность на скобки (x-x[0])...(x-x[i-1])
        for(k=0;k<i;k++)F*=(x-x[k]);
        res+=F;//полином
    }
return res;
}

Автор: igolka6662 28.11.2010, 11:09
А как вывести на экран сам полином?

Автор: sentinel 4.12.2010, 12:40
Цитата(igolka6662 @ 28.11.2010,  11:09)
А как вывести на экран сам полином?

в каком виде вы хотите и зачем?

Автор: igolka6662 8.12.2010, 19:38
В обычном виде, полином степени n-1 с коэффециэнтами перед х. Если можно, то объясните как, посчитать в узлах я написал, а чтобы вывести сам полином, не получается. Задание у меня такое.

Автор: Felon812 14.12.2015, 17:09
По Ньютону можно взять https://studlearn.com/works/details/laboratornaya-rabota-metod-razdelyonnykh-razn-939 на Delphi с выводом на экран и на его основе попробовать разобраться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)