Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++] Интерполяция, Линейная, метод Лагранжа, метод Ньютона 
:(
    Опции темы
aneberne
Дата 12.4.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Помогите пожалуйста, очень надо

Интерполяция
Линейная интерполяция
Полином Лагранжа
Интерполяция Ньютона

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

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

Это сообщение отредактировал(а) aneberne - 12.4.2009, 18:33
PM MAIL   Вверх
aneberne
Дата 13.4.2009, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



прошу проверить ) или как-то упростить, если мона)

Лагранж
Код

#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();
 
}

PM MAIL   Вверх
sentinel
Дата 26.4.2010, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.8.2009

Репутация: нет
Всего: нет



Считается значение полинома в точке х, 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;
}


Это сообщение отредактировал(а) sentinel - 26.4.2010, 21:49
PM MAIL   Вверх
igolka6662
Дата 28.11.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.11.2010

Репутация: нет
Всего: нет



А как вывести на экран сам полином?
PM MAIL   Вверх
sentinel
Дата 4.12.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.8.2009

Репутация: нет
Всего: нет



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

в каком виде вы хотите и зачем?
PM MAIL   Вверх
igolka6662
Дата 8.12.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.11.2010

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) igolka6662 - 8.12.2010, 19:39
PM MAIL   Вверх
Felon812
Дата 14.12.2015, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 14.12.2015

Репутация: нет
Всего: нет



По Ньютону можно взять пример на Delphi с выводом на экран и на его основе попробовать разобраться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.