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

Аппроксимация данных методом наименьших квадратов

03.06.2021, 01:22. Показов 2443. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравия желаю. Я пишу учебную практику по теме аппроксимация "методом наименьших квадратов". Товарищ помог написать программу, но проблема в том, что при определенных данных, например, указании точек линейной функции, программа худо бедно показывает ожидаемый результат. Но, когда дело доходит до настоящих рандомных токах, то выводит числа которые вообще не находятся в предполагаемом диапазоне - появляются какие-то отрицательные точки, какие-то двузначные, а то и трёхзначные числа при исходных однозначных. Прошу помочь мне понять в чем ошибка или по какой причине такое происходит.
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
#include <iostream>
#include <math.h>
 
#define  N 6        //максимальное количество точек;
 
using namespace std;
 
int K = 3, pts = 5;     //К-степень аппроксимирующего полинома, pts-текущее количество узловых точек
 
//a- массив коэффициентов полинома; b- массив свободных членов системы уравнений; x,y- координаты узловых точек;
float a[N], b[N], sums[N][N], y[N] = { 2, 4, 6, 8, 10, 12},
 x[N] = { 0, 1, 2, 3, 4, 5};
 
 
float Power(float v, int p);    //возводит v в степень p;
void InputData();               //ввод данных
void OutputData();               //вывод данных
void Calculate();               //вычисляет коэффициенты полинома
void Refresh();             //обнуляет все массивы перед повторным
 
 
float Power(float v, int p)
{
    if (p == 0) return 1;
    if (p > 1) v *= Power(v, p - 1);
    return v;
}
 
void InputData()
{
    cout << "Введите данные: ";
    for (int i = 0; i < N; i++)
    {
        cin >> y[i];
    }
}
 
 
void Calculate()
{
    int i, j, k;
    float s, M;
    Refresh();
    //заполняем коэффициенты системы уравнений
    for (i = 0; i < K + 1; i++)
    {
        for (j = 0; j < K + 1; j++)
        {
            sums[i][j] = 0;
            for (k = 0; k < pts; k++)
                sums[i][j] += Power(x[k], i + j);
        }
    }
    //заполняем столбец свободных членов
    for (i = 0; i < K + 1; i++)
    {
        b[i] = 0;
        for (k = 0; k < pts; k++)
            b[i] += Power(x[k], i) * y[k];
    }
    //применяем метод Гаусса для приведения матрицы системы к треугольному виду
    for (k = 0; k < K + 1; k++)
    {
        for (i = k + 1; i < K + 1; i++)
        {
            M = sums[i][k] / sums[k][k];
            for (j = k; j < K + 1; j++)
                sums[i][j] -= M * sums[k][j];
            b[i] -= M * b[k];
        }
    }
    //вычисляем коэффициенты аппроксимирующего полинома
    for (i = K; i >= 0; i--)
    {
        s = 0;
        for (j = i; j < K + 1; j++)
            s += sums[i][j] * a[j];
        a[i] = (b[i] - s) / sums[i][i];
    }
}
 
void OutputData()
{
    cout << "------------X[]--------------\n";
    for (int i = 0; i < N; i++)
    {
        cout << x[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "------------Y[]--------------\n";
    for (int i = 0; i < N; i++)
    {
        cout << y[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "------------КОЭФ А--------------\n";
    for (int i = 0; i < N; i++)
    {
        cout << a[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "------------СВОБОДНЫЕ ЧЛЕНЫ Б---\n";
    for (int i = 0; i < N; i++)
    {
        cout << b[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
 
    cout << "------------ИТОГ--------------\n";
    for (int i = 1; i < N; i++)
    {
        for (int j = 1; j <= K; j++)
        {
            cout << (a[j] * Power(i, j)) << endl;
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    InputData();
    Calculate();
    OutputData();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2021, 01:22
Ответы с готовыми решениями:

Метод наименьших квадратов/лаба 3 - аппроксимация/ С++
Добрый день! Помогите исправить неисправность программы: #include &quot;stdafx.h&quot; #include...

Линейная аппроксимация: метод наименьших квадратов (МНК)
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; // Задание...

Решение функции методом наименьших квадратов
Здравствуйте! Есть функция вида 5x+2+1/100 sin(8x) её нужно решить методом наименьших квадратов на...

Найти приближенное значение сопротивления методом наименьших квадратов
Задано два списка, которые содержат результаты N-измерений тока (I) и напряжения (U) на неизвестном...

1
0 / 0 / 0
Регистрация: 03.06.2021
Сообщений: 2
13.06.2021, 16:46  [ТС] 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
void OutputData()
{
    int Yi = 0;
    cout << "\n------------X[]--------------\n";
    for (int i = 0; i < pts; i++)
    {
        cout << x[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "\n------------Y[]--------------\n";
    for (int i = 0; i < pts; i++)
    {
        cout << y[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "\n------------КОЭФ А--------------\n";
    for (int i = 0; i < pts; i++)
    {
        cout << a[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "\n------------СВОБОДНЫЕ ЧЛЕНЫ Б---\n";
    for (int i = 0; i < pts; i++)
    {
        cout << b[i] << "  ";
        if (i == N - 1)
        {
            cout << endl;
        }
    }
 
    cout << "\n\n------------ИТОГ--------------\n";
    cout << "Аппроксимирующая функция имеет следующий вид:\n";
    for (int i = 0; i <= K; i++)
    {
        cout << a[i] << " * X^(" << i << ") ";
        if (i < K)
        {
            cout << "+ ";
        }
    }
 
    cout << "\n\nТочки данной функции:";
    for (int i = 1; i < pts; i++)
    {
        float Yi = 0;
        for (int j = 0; j <= K; j++)
        {
            Yi += (a[j] * Power(i, j));
        }
        cout << Yi << "  ";
    }
    cout << "\n";
}
0
13.06.2021, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2021, 16:46
Помогаю со студенческими работами здесь

Аппроксимирование методом наименьших квадратов ВАХ биполярного транзистора
Здравствуйте. Помогите пожалуйста. Суть задания: необходимо аппроксимировать методом наименьших...

Необходимо аппроксимировать методом наименьших квадратов ВАХ биполярного транзистора
Здравствуйте, пишу из-за нашего плохого образования, дали задание которое сам не могу решить,...

Полиномиальная аппроксимация функции методом наименьших квадратов
Огромная просьба. Пожалуйста помогите. Необходимо аппроксимировать график , построеный по таблично...

Решение СЛАУ методом наименьших квадратов
Помогите, пожалуйста. Надо реализовать алгогритм из книги Уилкинсон Ранш Справочник алгоритмов на...

Решение нелинейной системы уравнений методом наименьших квадратов.
Здравствуйте. Помогите пожалуйста. Мне нужна программа, которая реализует метод наимешьших...

Аппроксимация данных методом наименьших квадратов
помогите написать программу для аппроксимации данных заданных в таблице


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

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

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