0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 8
1

Интерполяционный метод Ньютона (ошибка при увеличении степени полинома)

08.04.2018, 16:43. Показов 1611. Ответов 1
Метки нет (Все метки)

При увеличении n(степень полинома)>4
выдает ошибку

Это может быть вызвано повреждением кучи и указывает на ошибку в Методы вычислений.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Методы вычислений.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки


первичный гугл показал) что проблемы с выделением и удалением памяти, но на этом все и остановилось



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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <math.h>
#include "Print.h"
#include "Back.h"
#include "Straight.h"
 
using namespace std;
 
int main()
{
         setlocale (LC_ALL, "RUS");
        
             //           double X[]={5, 10, 15, 20, 25}; //синус
             //           double Y[]={0.0872, 0.1736, 0.2588, 0.3420, 0.4226};
                          double X[]={5, 10, 15, 20, 25, 30}; //косинус
                          double Y[]={0.9962, 0.9848, 0.9659, 0.9397, 0.9063 , 0.8660};
               //         double X[]={1, 1.05, 1.1, 1.15, 1.2}; //  2-3*x+4*x^2-6*x^3
               //         double Y[]={-3, -3.685, -4.445, -5.285, -6.207};
          //       double X[]={0.5, 1, 1.5, 2, 2.5, 3}; //   e^x
                  //      double Y[]={1.648, 2.718, 4.481, 7.389, 12.182, 20.1};
 
 
                        int n=5;
                        double p = 0;
                        double testX = 0;
 
                        cout<<"Вводим проверяемый Х"<<endl;
                        cin>>testX;
 
        
 
            double **razn= new double *[n+1];
             for (int i=0;i<=n;++i)
                 {
                razn[i] = new double [n+1];
                // выделяем память
                 }
    
             
     for ( int i=0 ; i < n+1 ; i++)
          for ( int j=0 ; j < n+1 ; j++)
            {   razn [i][j]= 0;
                      razn [0][j]=Y[j];
              }
 
 
 
 
 
             for (int i=1;i<=n;i++)
                 {
                for(int j=1; j<=n ;j++)
                     {
                      if (i<=j)
                        razn[i][j]=razn[i-1][j]-razn[i-1][j-1];//получаем таблицу разностей
                     }
                 }
 
 
 
    print (n,razn);
 
 
   if (abs(testX-X[0])>0.5) p = back (X,Y,n,testX,razn);
   else p = straight (X,Y,n,testX,razn);
 
 
 
 
 
   cout<<"Значение в точке="<<p<<endl;
  // cout<<"Погрешность="<<abs(sin(testX*0.0174533)-p)<<endl; //Синус
  //    cout<<"Погрешность="<<abs(cos(testX*0.0174533)-p)<<endl;//Косинус
     
 
 
   for(int i=0 ;i < n; i++){
    delete [] razn[i];
    razn[i] = NULL;
  }
  delete [] razn;
  razn = NULL;
 
 
    system("pause");
 
 
    return 0;
}
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include <math.h>
 
using namespace std;
 
double back (double X[], double Y[], int n, double testX, double **razn)
{
double q = (testX - X[n])/(X[1]-X[0]);
double sum = 0;
double som = 0;
double *mas = new double;
double tmp = 1; //множитель скобок
int fact = 1;
int p = 1;
sum = Y[n];
 
 
        for(int i=0;i<n;i++)
            {       mas[i]=q+i;
                    tmp *= mas[i];
                    som = (razn[i+1][n]*tmp)/fact;
                    sum = sum + som;
                        p++;
                        fact=fact*p; 
                    
        }
 
 
        cout<<"Обратный метод"<<endl;
    
    return sum;     
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2018, 16:43
Ответы с готовыми решениями:

Выписать первый интерполяционный полином ньютона второй степени
2)Выписать первый интерполяционный полином ньютона второй степени P2(x)график которого проходи по...

Найти приближенное значение функции (интерполяционный многочлен Ньютона 3-й степени)
Написать программу на языке С которая: находит приближённое значение функции заданной табличным...

Метод хорд, интерполяционный многочлен Ньютона
1) Графически или аналитически отделить любой действительный корень уравнения f(x)=0 и вычислить...

Найти все трехзначные числа, которые при увеличении на 1 делятся на 2, при увеличении на 2 делятся на 3, при увеличении
Помогите разобраться с задачой Найти все трехзначные числа, которые при увеличении на 1...

1
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.04.2018, 23:40 2
Цитата Сообщение от v37xc9 Посмотреть сообщение
C++
1
double *mas = new double;
Цитата Сообщение от v37xc9 Посмотреть сообщение
C++
1
2
3
for(int i=0;i<n;i++) 
{ 
    mas[i]=q+i;
Память под один double выделена, куда там по индексам больше нуля обращаться? И освобождать нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2018, 23:40
Помогаю со студенческими работами здесь

Задача интерполяции методом полинома Ньютона и полинома Лагранжа
Решить задачу интерполяции методом полинома Ньютона и полинома Лагранжа 1 2 4 ...

Программа вычисляющая интерполяционный многочлен Ньютона, останавливается при компиляции на 12 строке
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include&lt;math.h&gt; using namespace ...

Делимость полинома степени m на полином степени 4
Добрый вечер. У меня задача: найти, при каких m один полином (степени m) делится на другой. Вот...

Напечатайте в строку все трехзначные числа, которые при увеличении на 1 кратные 2, при увеличении на 2 кратные 3
2.Напечатайте в строку все трехзначные числа, которые при увеличении на 1 кратные 2, при увеличении...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru