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

Линейный Метод Наименьших Квадратов, ошибка в расчетах - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Решение квадратных уравнений http://www.cyberforum.ru/cpp-beginners/thread621346.html
#include <iostream> #include <conio.h> #include <cmath> using namespace std; void roots(float a, float b, float c) { float d = b * b - 4 * a * c; cout << "Discriminant = " << d <<...
C++ Двухмерный динамической массив Привет, помогите пожалуйста написать программу, половину уже написал. Задание такое: 1.Вставить ряд в массив.(Зделал) char a = "__________________________________________________"; 2.Вставить... http://www.cyberforum.ru/cpp-beginners/thread621342.html
C++ Выход в случае ввода пустой строки
Опять 25 =( Порылся в своих старых темах, опять полистал учебник, но голова не хочет соображать. Где-то допускаю ошибку и прям чую, что знаю где, но не могу понять как :p Программа работает...
Массивы. Ошибка в программе C++
Почему я с клавиатуры ввожу в массив данные русским текстом, а массив запоминает какие-то "кракозябли"? И из за этого проверка условия не срабатывает... Помогите решить проблему. #include...
C++ Конус в воде http://www.cyberforum.ru/cpp-beginners/thread621262.html
Помогите плиз. Дан конус с радиусом B и высотой А, который плавает в воде. В зависимости от плотности конуса, необходимо найти расстояние от воды до верхушки конуса. Я задал плотность 0<p<=1000 ...
C++ Факториал через рекурсию Подскажите, как можно вычислить факториал некоторого числа через рекурсию функций (через цикл либо другим методом не интересует). Есть следующий кусок кода, но я не могу понять как заставить... подробнее

Показать сообщение отдельно
prettynetty
2 / 2 / 1
Регистрация: 09.07.2012
Сообщений: 14

Линейный Метод Наименьших Квадратов, ошибка в расчетах - C++

09.07.2012, 15:20. Просмотров 3245. Ответов 1
Метки (Все метки)

Разработка программы аппроксимации табличной функции степенным рядом( линейный метод наименьших квадратов).
использование глобальных переменных не допускается. Ошибка в расчетах. Думаю, что проблема тут
C++
1
2
3
4
5
6
7
8
9
while(!strstr(s1,"EOF"))
        {
            fscanf(f,"%s%s",s1,s2);
            x[nCount]=atof(s1);
            y[nCount]=atof(s2);
            nCount++;
            x = (double *)realloc((void *)x,(nCount + 1)*sizeof(double));
            y = (double *)realloc((void *)y,(nCount + 1)*sizeof(double));
        }
ВЕСЬ ТЕКСТ
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
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
 
void p1();
void p2();
double * MNK(double *x, double *y, int n, int k);
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
double F(double x, double *c, int k);
 
 
void main()
{
    SetConsoleOutputCP(1251);
    int key;
    printf("\t\tАппроксимация методом НК\r\n");
    printf("\tМеню:\r\n");
    printf("1 - Диалоговый ввод\r\n");
    printf("2 - Данные из файла\r\n");
    scanf("%d", &key);
    if(key == 1)
        p1();
    if(key == 2)
        p2();
    if(key!=1 && key!=2){ printf("Неверный ввод!"); exit(0);}
}
 
void p1()
{
    int nCount;
    double *x, *y;
    int k;
    double a,rez, *c;
    printf("Введите число эксперементальных точек\r\n");
    scanf("%d", &nCount);
    x=(double *)malloc(nCount*sizeof(double));
    y=(double *)malloc(nCount*sizeof(double));
    for(int i=0; i<nCount; i++)
    {
        printf("\tТочка %d:\r\n", i+1);
        printf("Аргумент\t"); scanf("%f", &x[i]);
        printf("Функция \t");scanf("%f", &y[i]);
    }
    printf("Ввод окончен\r\n");
    printf("Данные введены\r\n");
    printf("Введите степень разложения\r\n");
    printf("Большие значения степени (более 10) увеличивают точность расчёта\r\n");
    scanf("%d", &k);
    c=MNK(x,y,nCount,k);
    printf("Введите значение аргумента\t");
    scanf("%f", &a);
    rez = F(a,c,k);
    printf("Расчётное значение функции :\t%f\r\n", rez);
    }
 
void p2()
{
    FILE *f;
    double *x, *y, *c;
    int k;
    if((f=fopen("dannie.txt","rb")) )
    {
        fseek(f,0,SEEK_END);
        long fLen=ftell(f);
        fseek(f,0,SEEK_SET);
        char s1[16], s2[16];
        int nCount=0;
        x=(double *)malloc((nCount + 1)*sizeof(double));
        y=(double *)malloc((nCount + 1)*sizeof(double));
        while(!strstr(s2,"y"))
            fscanf(f,"%s%s",s1,s2);
        while(!strstr(s1,"EOF"))
        {
            fscanf(f,"%s%s",s1,s2);
            x[nCount]=atof(s1);
            y[nCount]=atof(s2);
            nCount++;
            x = (double *)realloc((void *)x,(nCount + 1)*sizeof(double));
            y = (double *)realloc((void *)y,(nCount + 1)*sizeof(double));
        }
        nCount--;
        fclose(f);
        printf("Данные введены\r\n");
        printf("Введите степень разложения\r\n");
        printf("Большие значения степени (более 10) увеличивают точность расчёта\r\n");
        scanf("%d",&k);
        c = MNK(x, y, nCount, k);
        double a,rez;
        printf("Введите значение аргумента\t");
        scanf("%f",&a);
        rez = F(a,c,k);
        printf("Расчётное значение функции :\t%f\r\n", rez);
    }
}
 
double * MNK(double *x, double *y, int n, int k)
{
    double **a =new double *[k];
    double *b=new double [k];
    double *c=new double [k];
    for(int m=0,i,j; m < k; m++)
    {
        a[m]=new double[k];
        for(j=0; j<k; j++)
        {
            a[m][j]=0;
            for(i=0; i<n;i++)
                a[m][j]+=pow(x[i],m+j);
        }
        b[m]=0;
        for(i=0; i<n; i++)
            b[m]+=pow(x[i],m)*y[i];
    }
    PryamoiHod(k,a,b);
    ObratniHod(k,a,b,c);
    return c;
}
 
void PryamoiHod(int n, double **a, double *b)
{
    double v;
    for(int k=0,i,j,im; k<n-1; k++)
    {
        im=k;
        for(i=k+1; i<n; i++)
        {
            if(fabs(a[im][k]) < fabs(a[i][k]))
            {im=i;}}
        if(im!=k)
        {for(j=0; j<n; j++)
            {v=a[im][j];
            a[im][j]=a[k][j];
            a[k][j]=v;}
            v=b[im];
            b[im]=b[k];
            b[k]=v;}
        for(i=k + 1; i<n; i++)
        {
            v=a[i][k]/a[k][k];
            a[i][k]=0;
            b[i]=b[i]-v*b[k];
            for(j=k+1; j<n; j++)
            {a[i][j]=a[i][j]-v*a[k][j];}}}}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
    double s=0;
    x[n-1]=b[n-1]/a[n-1][n-1];
    for(int i=n-2,j; 0<=i; i--)
    {   s=0;
        for(j=i+1; j<n; j++)
        {       s=s+a[i][j]*x[j];}
        x[i]=(b[i]-s)/a[i][i];
    }
}
 
double F(double x, double *c, int k)
{
    double RetVal=1;
    for(int i=0; i<k; i++)
    RetVal+=c[i]*pow(x,i);
    return RetVal;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru