Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2015, 14:13   #1
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию Интерполяция Лагранжа

Второй день бьюсь, никак не могу понять, что я делаю не так.
Есть формулы и программа на Бейсике. Есть в описании контрольный пример. Но, беда втом, что результаты выдаваемые программами на Бейсике и С++, не совпадают с контрольным примером.
Вот условие: Я знаю, ошибка в представлении данных, но не погу понять, где именно.
Изображения
Тип файла: jpg interpol.jpg (105.1 Кб, 117 просмотров)
Тип файла: jpg Interpolation.jpg (26.0 Кб, 33 просмотров)
Тип файла: jpg res.jpg (2.3 Кб, 52 просмотров)
Тип файла: jpg interC++.jpg (4.0 Кб, 44 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.01.2015, 14:16   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Так совпадают же. Просто во втором случае идёт округление до 6 символов после запятой, а в первом до 7.
WinCoder вне форума Ответить с цитированием
Старый 26.01.2015, 14:21   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от WinCoder Посмотреть сообщение
Так совпадают же. Просто во втором случае идёт округление до 6 символов после запятой, а в первом до 7.
Совпадают на консоли у разных программ. Не совпадение с контрольными примерами (подчёркнуто красным).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.01.2015, 14:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так может везде двойную точность для констант поставить? Все таки 7 значащих
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.01.2015, 15:01   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Да при чём тут точность? Тьфу на неё. 0,6087558 много больше чем 0,4204928.
В кубической интерполяции, округление результата, на сам расчёт не влияет.
И ещё не понятно. В программах выводится один результат - Y, а в примерах даны результаты двух расчётов Y(0,9) и Y(1,1) с какого марса они упали? Формулы на этот счёт вооще молчат.
Догадался. Y(0,9) это X = 0.9 но результат всё равно не совпадает с примером.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 26.01.2015 в 15:11.
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.01.2015, 15:39   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Называли бы переменные нормально, то и проблем бы не было
Например 1-ое присвоение игрека заменить на:
y:=(1-p)*c+p*d;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.01.2015, 15:58   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

С переменными у меня всё ОК :
Код:
// Интерполяция при H=const по формулам Лагранжа
// Степень полинома от 1 до 5
bool InterpolationLagranj(double *Y, double H, double X,
                          double X0, uint degree, double &res)
{
  bool ret = true;
  double p = (X - X0) / H, i, j, k, l, m, y;
  switch(degree)
  {
    case 1:{res = (1 - p) * Y[0] + p * Y[1]; break;}
    case 2:{
             res = p * (p - 1) * Y[0] / 2 + (1 - p * p) * Y[1] + p * (p + 1) * Y[2] / 2;
             break;
           }
    case 3:{
             m = (p - 2) / 2;
             y = -p * (p - 1) * m * Y[0] / 3 + (p * p - 1) * m * Y[1];
             res = y - p * (p + 1) * m * Y[2] + p * (p * p - 1) * Y[3] / 6;
             break;
           }
    case 4:{
             m = (p * p - 1) / 2; k = (p * p - 4) / 2;
             y = m * p * (p - 2) * Y[0] / 12 - (p - 1) * p * k * Y[1] / 3 + m * k * Y[2];
             res = y - (p + 1) * p * k * Y[3] / 3 + m * p * (p + 2) * Y[4] / 12;
             break;
           }
    case 5:{
             m = p * p - 1;
             i = m / 24;
             j = -p * i * (p - 3);
             k = m - 3;
             l = k * (p - 3) / 12;
             y = j * (p - 2) * Y[0] / 5 + l * p * (p - 1) * Y[1] / 2 - m * l * Y[2];
             res = y + p * (p + 1) * l * Y[3] + j * (p + 2) * Y[4] + p * i * k * Y[5] / 5;
             break;
           }
    default : ret = false;
  }
  return ret;
}
Формулы тоже проверены - перепроверены 100 раз. Где-то у меня с теорией пробел, а именно с правильностью задания коэффициентов.
Исходная прога, на бейсике:
Изображения
Тип файла: jpg Basic.jpg (87.0 Кб, 43 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.01.2015, 16:07   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Нет, не порядок. Почему у меня y:=(1-p)*c+p*d; дает 0,6087558. Дальше формулы не смотрел
смотрим что такое c и d, и что такое a и b как в вашей формуле. И что такое y0 и y1. В исходной проге чепуха
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.01.2015 в 16:11.
Аватар вне форума Ответить с цитированием
Старый 26.01.2015, 16:28   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Почему у меня y:=(1-p)*c+p*d; дает 0,6087558.
Может я Р не правильно вычисляю т.к. ошибка во всех формулах? И почему у вас c+p*d если даже в формуле Y0 и Y1, а вводится A , B?
P = (X - X0) / H = (1 - 1.1) / 0.2 = 0.5
Y = (1 - P) * Y0 + P * Y1 = (1 - 0.5) * 0.36699114 + 0.5 * 0.4739944 = 0,42049277. Посчитал вручную на калькуляторе
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 26.01.2015 в 16:32.
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.01.2015, 16:47   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В примере y(0)=0.5686566
С какого перепугу вместо него a подставлять? а=y(-2); b=y(-1); c=y(0) и т.д.
Я про код в #1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.01.2015 в 16:49.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерполяция полиномом Лагранжа(DELPHI) VENOMIK Помощь студентам 3 01.03.2013 14:38
На C++ Разработать программу “Кусочно-линейная и квадратичная интерполяция. Глобальная интерполяция”. KennyMc Помощь студентам 0 26.02.2012 12:08
Интерполяция табличных данных полиномом Лагранжа VENOMIK Помощь студентам 3 06.11.2011 14:04
Интерполяция лагранжа Styks Общие вопросы C/C++ 4 14.12.2009 18:47
интерполяция методом Лагранжа (синус) сон Общие вопросы C/C++ 6 09.11.2009 11:02