Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27

Нахождение формулы аппроксимации

01.05.2012, 19:52. Показов 3699. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, использовал в своем проекте по примеру с данного сайта код для нахождения аппроксимации МНК, в алгоритме разобрался, всё поподставлял, всё работает, только одна проблема, не могу понять как сделать так, чтобы программа сама находила формулу типа
F(x) = a0 + ax + a2x2 + ... + akxk, где k<N
Если бы условие ограничивалось бы десятью вариациями, я бы всё в оператор switch загнал бы, а по условии этих "ak" может быть тысячи. Значения "ak" и "x" известны
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2012, 19:52
Ответы с готовыми решениями:

Эмпирической формулы для аппроксимации экспериментальных данных.
не знаю как подобрать формулу в моем случае это квадратическая зависимость y=ax2+bx+c при a&gt;0 и при a&lt;0

Нахождение функции двух переменных методом аппроксимации [Tutorial]
За основу примера взята таблица из сообщения &quot;Нахождение функции двух переменных - MS Excel&quot;,расположенная здесь ...

формулы для нахождение значения определенного интеграла
В вики пишут об самом известном методе с 5 узлами,но я так и не нагуглил . Покажите,тыкните носом ,молю (=

11
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.05.2012, 11:25
На указанной вами страничке есть ответ - текстовый файл с таблицей значений хi уi. Там, конечно, вычисляются коэффициенты полинома по известным значениям функций и переменных, но раз уж
Цитата Сообщение от -Marshall- Посмотреть сообщение
в алгоритме разобрался, всё поподставлял, всё работает
то и модифицировать чтение из файла под переменные и коэффициенты не составит труда.
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
02.05.2012, 13:21
зачем switch? так не подходит
C++
1
2
3
4
5
6
7
double s = 0;
double m = 1;
for (int i = 0; i < n; i++)
{
    s += a[i] * m;
    m *= x;
}
0
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27
02.05.2012, 16:12  [ТС]
vxg, Что-то не получается по вашему методу. Я нашел на хабре тему, где готовое решение на С# только, подставил в С++, но всё равно какая-то каша получается. В той программе, что на хабре, мы можем получить только одну функцию F(x), а мне надо чтобы сразу все находило, ибо в программе это всё вырисовывается еще в график.
Вот тот участок кода, что на C#
C#
1
2
3
4
5
            double y = 0;
            for (int i = 0; i < basis; i++)
            {
                y += result[i] * Math.Pow(x, i);
            }
Сделал всё также на С++, но безрезультатно..
C++
1
2
3
4
5
6
7
    for (i = 0; i < N + 1; i++)
    {
        y1 += a[i] * pow(x[i], i);
        ShowMessage(FloatToStr(y1));
        Form1->ListBox1->Items->Add(FloatToStr(y1));
        Form1->Series2->AddY(y1);
    }

На вход подаю такие значения: x0=1, x1=2, x2=3; y0=1,5, y1=2,5, y2=3,5
На выходе должен получить те же самые значения, что и у игрека, но получаю "0,5, 2,5, 2,5"

Добавлено через 16 минут
Все данные берутся из StringGrid'a. Выходные значения для проверки записываю в ListBox и вывожу на график соответственно.
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
02.05.2012, 16:49
что то вы не то говорите...
вот, проверяем
C++
1
2
3
4
5
6
7
8
9
10
11
double a[3] = {1, 2, 3};
int n = 3;
double x = 8;
 
double s = 0;
double m = 1;
for (int i = 0; i < n; i++)
{
    s += a[i] * m;
    m *= x;
}
как и должно быть получаем 209:
F(8)=1+2*8+3*8*8=209
о каких других "всех" значениях речь? вычислите значения по приведенному алгоритму для любого количества иксов...

Добавлено через 5 минут
...если вас тревожит незначительные (или очень значительные если формула была выбрана неудачно) отличия получаемых от полинома значений от оригинальных точек, то дело в точности сглаживания, если нужно точное соответствие нужно делать интерполяцию, но это зависит от вашей задачи
0
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27
02.05.2012, 17:27  [ТС]
vxg, может я просто чего-то недопонимаю, математика тяжело даётся. Но данный метод для единичного вывода f(x)? В вашем случае f(8), а мне требуется вывести все f(x) по кол-ву узлов, т.е. если n=3, значит я должен иметь значения f(1), f(2), f(3)

Добавлено через 2 минуты
Если значение x является статическим и надо найти только одну функцию от икса, тогда ваш способ работает. Я ж говорю, мне еще график по аппроксимирующей функции надо построить просто.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.05.2012, 17:39
C++
1
2
3
4
5
6
7
8
9
10
11
const int N = 3, M = 4;
double a[N] = {1, 2, 3};
double x[M] = {3, 2, 1, 0}; 
double s[M] = {0};
 
for ( int j = 0, xj = 0, i; j < M; xj = x[++j];) {  
    for ( i = 0; i < N; i++ ) {
        s[j] += a[i] * xj;
        xj *= x[j];
    }
}
Массивы a[] x[] читайте из файла, раз уж их у вас могут быть тысячи.
0
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27
02.05.2012, 19:16  [ТС]
BRcr, спасибо, но что-то результаты выдаёт не те или я не там их вывожу..

C++
1
2
3
4
5
6
7
8
9
10
11
12
for(j = 0; j < K + 1; xj = x[j++])
{
    for(i = 0; i < N; i++)
    {
        func[j] += a[i] * xj;
        xj *= x[i];
    }
 
}
for (int i = 0; i < N; i++) {
Form1->ListBox1->Items->Add(FloatToStr(func[i]));
}
Добавлено через 13 минут
Может я некорректно излагаю свою задумку. Вобщем мне надо, чтобы вот это было на автомате:

C++
1
2
3
4
5
func[0] = a[0];
func[1] = a[0] + a[1] * x[0];
func[2] = a[0] + (a[1] * x[1]) + (a[2] * pow(x[1], 2));
func[3] = a[0] + (a[1] * x[2]) + (a[2] * pow(x[2], 2)) + (a[3] * pow(x[2], 3));
func[4] = a[0] + (a[1] * x[3]) + (a[2] * pow(x[3], 2)) + (a[3] * pow(x[3], 3)) + (a[4] * pow(x[4], 4));
и так до кол-ва указанных узлов. Мне кажется такое вообще невозможно реализовать..
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.05.2012, 23:47
Все возможно. Сразу надо было точно просьбу формулировать, а не топтаться вокруг
C++
1
2
3
4
5
6
7
8
9
10
11
    const int N = 5;
    double a[N] = {1, 2, 3, 4, 5};
    double x[N] = {3, 2, 1, 5};
    double s[N] = {0};
 
    for ( int j = 0, xj = 0, i; j < N; j++ ) {
        for ( i = 1, ( j > 0 ? xj = x[j - 1] : xj ), s[j] = a[0]; i <= j; i++ ) {
            s[j] += a[i] * xj;
            xj *= x[j-1];
        }
    }

Не по теме:

Только не злоупотребляйте этим своим "кажется такое вообще невозможно реализовать..", тут, конечно, все любят в спортивных целях подлавливать друг-друга на возможных невозможностях, но все же, все же...:D


Вот вывод кода:
Миниатюры
Нахождение формулы аппроксимации  
1
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
03.05.2012, 12:37
Цитата Сообщение от -Marshall- Посмотреть сообщение
Вобщем мне надо, чтобы вот это было на автомате
а что это такое и какое оно имеет отношение к МНК?
если вам нужно получить значение функции для нескольких точек просто оформите ее как процедуру и вызывайте с теми иксами которые вам нужны - количество коэффициентов в формуле от подаваемого в функцию икса не зависит. мне все же кажется, что вы на самом деле толкуете про что то похожее на реализацию нахождения коэффициентов полинома...
0
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27
03.05.2012, 16:05  [ТС]
BRcr, спасибо большое.

vxg, коэффициенты аппроксимации находились с помощью МНК, это с помощью того сайта реализовал, всё получилось, теперь передо мной стала задача выводить на график аппроксимирующие функции от всех заданных иксов, как это сделать было, я не понимал. Честно вам сказать, сколько я не провел дней за чтением числовых методов, я всё равно ничего не понял про аппроксимацию.
0
Модератор
 Аватар для vxg
3409 / 2184 / 354
Регистрация: 13.01.2012
Сообщений: 8,462
03.05.2012, 16:40
аппроксимация от всех заданных иксов если я понимаю правильно русский язык это нахождение приближенного значения по аппроксимирующей формуле для заданных иксов. вид формулы (количество членов полинома) при этом не меняется. сама суть МНК в следующем - мы подбираем коэффициенты аппроксимирующей формулы таким образом что бы целевая функция (т.е. функция по которой мы будем оценивать хорошо или плохо наша формула описывает исходные данные, функция дающая нам некую оценку ошибки приближенных вычислений по нашей формуле в зависимости от подбираемых коэффициентов) имела минимальное значение (т.е. описывала максимально хорошо, с наименьшей ошибкой). в МНК в качестве целевой функции берут корень из суммы квадратов отклонений вычисленных по аппроксимирующей формуле и исходных значений деленный на количество исходных значений (т.е. пытаются вычислить на сколько в среднем будет отличаться вычисленные по аппроксимирующей формуле и исходные значения, для этого мы уходим от знака разницы через возведение в квадрат, усредняем и извлекаем корень возвращаясь к линейной шкале). все это засовываются в матаппарат при помощи которого получается и решается система уравнений дающая нам эти самые оптимальные в данном конкретном случае (т.е. для тех данных которые мы ввели и для того вида формулы которую мы выбрали) коэффициенты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2012, 16:40
Помогаю со студенческими работами здесь

Проверить истинность формулы логики предикатов. Формулы логики предикатов. Область истинности формулы
Помогите решить задания.Объясните как делать хотя бы первые 2.Или хотя бы укажите источник,благодаря которому получится решить данные...

Как подставить значение в формулу, из решенной формулы после предыдущей формулы.
У меня есть формула, после которой есть значения которые нужно туда подставить после слова &quot; где &quot; . как это осуществить в...

задачи на множество. вид формулы алгебры логики и упрощение формулы
не получается решить никак может знает кто?

При изменении формулы в ячейке скопировать формулы в ячейки ниже
можно ли как-то сделать через макрос чтобы он сам тянул другую функцию до самого низа? то есть я вписываю =макрос(главный) и после того...

Задача на использование Формулы полной вероятности и формулы Байеса
Помогите пожалуйста решить... Известно, что 95% выпускаемой продукции является стандартной. Контроль признаёт стандартную продукцию...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru