Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
illuminates
3 / 3 / 0
Регистрация: 14.06.2012
Сообщений: 106
#1

Интерполяция Лагранжа - C++

13.10.2013, 15:01. Просмотров 2562. Ответов 3
Метки нет (Все метки)

Добрый день! Помогите пожалуйста найти ошибку в программе, битый день делаю, я новичок, но как мне кажется очень логично написал код. Программа работает, но по непонятной причине выдаёт повторяющиеся значения. Где могла закрасться ошибка
задание: построить интерполяционный полином Лагранжа для функции f(x) = 4x - 7sinx на интервале [-2, 3], количество точек, в которых определена функция m = 4. Таблица исходной фунции вычисляется в точках x_i = -2 - i*5/m, i = 0,...,m. Используя полученную таблицу требуется вычислить значения функции, полинома и невязки в точках x_j = -2 - j*5/9, j = 0,...,9.

получилась программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
double lagrange(double _x);
double func(double _x);
int main( void )
{
  setlocale(LC_ALL, "Russian");
  int a=-2, b=3, m=4;
  double X[9], Nevyazka[9];
 
 
    for (short j=0; j<=9; j++)
    {
        X[j]=a+j*(b-a)/9;
        Nevyazka[j]=fabs(lagrange(X[j])-func(X[j]));
        cout<<"f(X"<<j<<")="<<func(X[j])<<";\t"<<"L(X"<<j<<")="<<lagrange(X[j])<<";\t"<<"Невязка  "<<Nevyazka[j]<<";\n";
    }
 
        getch();    
    return (0);
}
 
 
 
double lagrange(double _x)
{
        double L = 0, P = 1, x[5], y[5];
        int a=-2, b=4;
        short n=4;
        //double x[5] = {-2, -0.75, 0.5, 1.75, 3};
        //double y[5] = {-1.64, 1.77, -1.36, 0.11, 11.01};
        for (short i = 0; i < n; i++)
        {
            x[i]=a+(i*(b-a))/n;
            y[i]=4*x[i]-7*sin(x[i]);
        }
 
        for (short i = 0; i < n; i++)
        {    
            for (short j = 0; j < n; j++)
                {
                 if (j - i)
                 P *= (_x - x[j])/ (x[i] - x[j]);
                 }
             L += P * y[i];
        }       
 
        return L;
}
 
double func(double _x)
{
    return 4*_x-7*sin(_x);
}
http://img14.imageshack.us/img14/4338/bgix.png

Добавлено через 2 часа 28 минут
Поставил P=1 в подфункции:
Код
 for (short i = 0; i < n; i++)
        {   
         double P = 1;
         for (short j = 0; j < n; j++)
            {
             if (j - i)
                 P *= (_x - x[j])/ (x[i] - x[j]);
              }
             L += P * y[i];
        }
Но вместо долгожданной верной работы, работает совсем не верно. Теперь я совершено ничего уже не понимаю.

http://img191.imageshack.us/img191/779/zh23.png
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2013, 15:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Интерполяция Лагранжа (C++):

Интерполяция Лагранжа - C++
Доброго времени суток! У меня такая просьба, можно ли упростить данную программу? Т. е. сделать меньше строк в программе, убрать...

Интерполяция методом Лагранжа - C++
Не могу исправить ошибку в программе вычисляющей интерполяцию методом Лагранжа ошибка в 25,26 строках #include &lt;iostream&gt; #include...

Интерполяция полиномом Лагранжа - C++
Добрый день Я все пытаюсь разобраться с полиномом Лагранжа и столкнулся с очень интересным вопросом, по крайней мере, для себя: ...

Интерполяция полиномом Лагранжа - C++
Функция у = f(x) задана в табличной форме: x=0; y=1.763; x=0.2; y=1.917; x=0.4; y=2.143; а) cоставить алгоритм и программу...

Обратная интерполяция Лагранжа - C++
Помогите пожалуйста нужно найти все значения х по заданному у=1.5 float x = {1,2,3,4,5}; float y = {1.35,-4,0.97,-2,7.2};

Интерполяция методом Ньютона и Лагранжа - C++
Задано табличное представление функции: x y 3 4 7 10 11 22 15 26 19 23 Сравнить методы интерполяции Лагранжа и Ньютона...

3
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
13.10.2013, 15:22 #2
Цитата Сообщение от illuminates Посмотреть сообщение
j*(b-a)/9
C++
1
j*(b-a)/9.0
Добавлено через 1 минуту
Цитата Сообщение от illuminates Посмотреть сообщение
y[i]=4*x[i]-7*sin(x[i]);
y[i]=func(x[i])

Добавлено через 2 минуты
Цитата Сообщение от illuminates Посмотреть сообщение
for (short i = 0; i < n; i++)
* * * * { * *
* * * * * * for (short j = 0; j < n; j++)
* * * * * * * * {
* * * * * * * * *if (j - i)
* * * * * * * * *P *= (_x - x[j])/ (x[i] - x[j]);
* * * * * * * * *}
* * * * * * *L += P * y[i];
* * * * }
C++
1
2
3
4
5
6
7
8
for (short i = 0; i < n; i++){
  P=1.0;
  for (short j = 0; j < n; j++){
    if (j - i)
      P *= (_x - x[j])/ (x[i] - x[j]);
  }
  L += P * y[i];
 }
2
illuminates
3 / 3 / 0
Регистрация: 14.06.2012
Сообщений: 106
13.10.2013, 16:16  [ТС] #3
Kuzia domovenok, Вы гений СИ++!!! Благодарю!
2
Kuzia domovenok
13.10.2013, 21:39     Интерполяция Лагранжа
  #4

Не по теме:

Цитата Сообщение от illuminates Посмотреть сообщение
Благодарю!
для "благодарю" кнопка есть

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 21:39
Привет! Вот еще темы с ответами:

Оцените программу: Интерполяция через полином Лагранжа и через сокращённую формулу Ньютона - C++
Выкладываю программу интерполяции: -интерполирование через полином Лагранжа; -интерполирование через сокращённую формулу Ньютона. ...

Интерполяция заданной функции второй формулой Ньютона (обратная интерполяция) - C++
Программа накапливает ошибку, да и первые значения совсем уже &quot;приближённые&quot;. Явно что-то упустил. Посмотрите со стороны. #include...

Интерполяция изображения c++ - C++
Как сделать интерполяцию изображения если есть например диапазон от 30 до 110. Его нужно растянуть на диапазон от 0 до 255. Допустим берем...

Интерполяция Лагранжем - C++
Товарищи,очень прошу помочь не получается доделать задание((( сделал решение интеграла,а к нему нужно еше провести интерполяцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
13.10.2013, 21:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru