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

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

Войти
Регистрация
Восстановить пароль
 
strash
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 6
#1

Программа интерполяции измерений методом Ньютона - C++

26.04.2014, 21:22. Просмотров 279. Ответов 0
Метки нет (Все метки)

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

1 часть программы

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include<iostream>
#include<fstream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
long double zniach(int i,int j);
long double fstr(char*);
void vvod(void);
void matrix(void);
long double X[500];
long double Y[500];
long double C[500];
int nekd;
int N;
long double mass[500][500];
int main()
{
vvod();
if (nekd==1) return 0;
 
matrix();
if (nekd==1) return 0;
 
system("grafics.exe");
return 0;
}
 
void vvod(void)
{
char varvv=0;
while((varvv!='1')&&(varvv!='2'))
    {
    cout << "Kak vvesti dannye?\n1. S klaviatury\n2. Iz faila?\n";
    cin >> varvv;
    if ((varvv!='1')&&(varvv!='2')) cout <<"Vy doljny vvesty 1 ili 2!\n";
    }
char stroka[50];
if (varvv=='1')
    {
    cout <<"Vvedite chislo tochek.\n";
    cin >>stroka;
    N=(int)fstr(stroka);
    if (nekd==1) return;
    for(int i=0;i<N;i++)
        {
        cout<<"Vvedite X["<<i<<"]="; 
        cin>>stroka;
        X[i]=fstr(stroka);
        if (nekd==1) return;
        cout<<endl;
        cout<<"Vvedite Y["<<i<<"]="; 
        cin>>stroka;
        cout<<endl;
        Y[i]=fstr(stroka);
        if (nekd==1) return;
        }
    }
if (varvv=='2')
    {
    char filename[255];
    while (1) //Ввод имени и проверка файла
        {
        cout << "Vvedite imja faila. Fail ne doljen soderjat' bolee 255 simvolov, probelov i tol'ko latinskie bukvy.\n";
        for (int i=0;i<255;i++) filename[i]=0;
        cin >> filename;
        ifstream fin(filename); //проверка файла
        char q=0;
        fin >> q;
        fin.close();
        if (q==0)
            {
            cout << "\nFail  \"" << filename << "\"  Pustoj ili ne sushestvuet. Dlia prodoljenija najmite enter.\n";
            getch();
            }
        else 
            {
            break;
            }
        }
    ifstream fin(filename);
    fin>>stroka;
    N=(int)fstr(stroka);
    if (nekd==1) return;
    for(int i=0;i<N;i++)
        {
        fin>>stroka;
        X[i]=fstr(stroka);
        if (nekd==1) return;
        fin>>stroka;
        Y[i]=fstr(stroka);
        if (nekd==1) return;
        }
    fin.close();
    }
ofstream fout("data.txt");
for(int i=0;i<N;i++)
    fout<<X[i]<<"  "<<Y[i]<<endl;
fout.close();
}
 
void matrix(void)
{
for(int i=0;i<N;i++)
    mass[i][0]=1; 
for(int i=1;i<N;i++)
for(int j=1;j<i+1;j++)   
    mass[i][j]=zniach(i,j);
 
for(int i=0;i<N;i++)     
    {
    cout<<endl;
    for(int j=0;j<N;j++)
    cout <<mass[i][j]<<"  ";
    }
cout <<endl;
ofstream fout("out.txt");
fout<<N<<endl;
for(int i=0;i<N;i++)
    {
    if (mass[i][i]==0)
        {
        nekd=1;
        cout<<"Programma ne smojet poschitat' funkciju. Vozmojno vvedionnye dannye nekorrektny.\n";
        getch();
        return;
        }
    C[i]=Y[i]/mass[i][i];
    cout<<"\n"<<"C["<<i<<"]="<<C[i]<<endl;
    for(int j=i+1;j<N;j++)
        {
        mass[j][i]*=C[i];
        Y[j]-=mass[j][i];
        }
    fout<<C[i]<<endl;
    }
fout.close();
getch();
}
long double zniach(int i,int j)
   {    
    long double ZN=1;
    for(int q=0;q<j;q++)
    ZN*=X[i]-X[q];
    return ZN;
    }
 
long double fstr(char stroka[50])
{
nekd=0;
if (strlen(stroka)>20)
    {
    nekd=1;
    cout<<"Dannye nekorrektny.\n";
    getch();
    return 0;
    }
for (unsigned int i=0;i<strlen(stroka);i++)
    {
    if (((stroka[i]>='0')&&(stroka[i]<='9'))||(stroka[i]=='.')||(stroka[i]=='-')||(stroka[i]=='+'))
        {
        if ((stroka[i]=='-')||(stroka[i]=='+'))
            if (i!=0)
                {
                cout << "Dannye nekorrektny.\n";
                nekd=1;
                getch();
                return 0;
                }
        if (stroka[i]=='.')
            for (unsigned int q=0; q<i; q++)
                if (stroka[q]=='.')
                    {
                    cout << "Dannye nekorrektny.\n"; 
                    nekd=1;
                    getch();
                    return 0;
                    }
        }
    else 
        {
        nekd=1;
        cout<<"Dannye nekorrektny.\n";
        getch();
        return 0;
        }
    }
return atof(stroka); //преобразуем строку в число
}

2 часть программы
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
 
int gdriver = DETECT;
 
long double f(long double);
void vvod(void);
void massh(void);
void grafics(void);
 
long double C[500];
long double minim_x,maxim_x;
long double maxim_y, minim_y;
long double shagx, shagy;
long double X[500], Y[500];
int N=0;
 
int main()
{
clrscr();
initgraph(&gdriver, 0 , "");
 
vvod();
 
massh();
 
grafics();
 
getch();
return 0;
}
 
//Полином
long double f(long double x)
{
long double s=C[0];
for (int i=1;i<N;i++)
    {
    long double P=1;
    for (int q=0;q<i;q++)
        P*=x-X[q];
    s+=C[i]*P;
    }
return s;
}
 
void vvod(void)
{
//Ввод коеффициентов из файла
ifstream vvod("out.txt");
vvod >> N;
for (int i=0;i<N;i++)
    {
    vvod >> C[i];
    }
vvod.close();
 
//Ввод исходных данных из файла
 
ifstream data("data.txt");
for (i=0;i<N;i++)
    {
    data >> X[i] >> Y[i];
    }
data.close();
}
 
void massh(void)
{
//Поиск maxim_x и minim_x
minim_x=X[0];
maxim_x=X[0];
for (int i=0;i<N;i++)
    {
    if (X[i]<minim_x) minim_x=X[i];
    if (X[i]>maxim_x) maxim_x=X[i];
    }
 
//Вычисление шага x, шага y, maxy, miny
shagx=(maxim_x-minim_x)/620;
if (shagx==0) {cout << "Dannye nekorrektny"; getch();}
maxim_y=f(maxim_x);
minim_y=f(minim_x);
for(long double k=minim_x; k<=maxim_x; k+=shagx)
    {
    if(maxim_y<=f(k)) maxim_y=f(k);
    if(minim_y>=f(k)) minim_y=f(k);
    }
shagy=(maxim_y-minim_y)/460;
}
 
void grafics(void)
{
bar(0,0,getmaxim_x(),getmaxy());
//Рисование точек
for(int q=0;q<N;q++)
    {
    setcolor(2);
    circle(5+(int)((X[q]-minim_x)/shagx), 5+460-(int)((Y[q]-minim_y)/shagy),1);
    setfillstyle(1, 2);
    floodfill(5+(int)((X[q]-minim_x)/shagx), 5+460-(int)((Y[q]-minim_y)/shagy), 2);
    }
setcolor(4);
//Рисование функции
for (long double d=minim_x; d<=maxim_x; d+=shagx)
    line(5+(int)((d-minim_x)/shagx),5+460-(int)( (f(d)-minim_y)/shagy ),5+(int)((d-shagx-minim_x)/shagx),5+460-(int)( (f(d-shagx)-minim_y)/shagy ));
}
спасибо зарание добрые люди)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 21:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа интерполяции измерений методом Ньютона (C++):

Найти номер элемента методом интерполяции - C++
в первой части ошибок нет,показывает ошибку во второй части,где требуется найти номер элемента методом интерполяции.не могу понять...

Решить уравнение по заданной формуле методом хорд и модифицированным методом Ньютона - C++
8. Решить уравнение 5sinx - x = 0 на отрезке с точностью E методом хорд и модифицированным методом Ньютона.

Как задать криволинейный замкнутый контур по точкам методом кубической интерполяции? - C++
В с++ я новичок, полазив по форумам, я нашел некотрые коды, но они либо не работают, либо выдают не то что нужно. Не мог бы мне кто-нибудь...

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

Уравнение методом Ньютона - C++
Доброго времени суток, помогите пожалуйста, справиться с уравнением, которое нужно реализовать методом Ньютона. Есть уравнение, скрин...

Нахождение корней методом Ньютона - C++
Нужно написать программу вычисляющую корень полинома методом Ньютона. Подскажите, как можно описать функцию...

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

Решение СНАУ методом Ньютона - C++
Нужно написать программу для решения систем нелинейных алгебраических уравнений методом Ньютона. Наибольшая сложность заключается в том что...

'разобраться' с уравнением методом Ньютона - C++
Подскажите пожалуйста план действий, как это делать. Ибо в заданиях подобного рода я бессилен

Решить функцию методом Ньютона - C++
Нужно решить функцию методом Ньютона 0.1 x^2 - x \ln \,x=0. Отрезок содержащий корень . Точное значение должно выдать 1,1183. Но моя прога...

Функция Арксинус методом Ньютона - C++
Калькулятор имеет функции синус, косинус, необходимо написать арксинус методом Ньютона. Ниже код. Ошибка при вычислении отрицательных...


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

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

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