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

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

01.05.2012, 19:52. Показов 3687. Ответов 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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
03.05.2012, 12:37
Цитата Сообщение от -Marshall- Посмотреть сообщение
Вобщем мне надо, чтобы вот это было на автомате
а что это такое и какое оно имеет отношение к МНК?
если вам нужно получить значение функции для нескольких точек просто оформите ее как процедуру и вызывайте с теми иксами которые вам нужны - количество коэффициентов в формуле от подаваемого в функцию икса не зависит. мне все же кажется, что вы на самом деле толкуете про что то похожее на реализацию нахождения коэффициентов полинома...
0
1 / 1 / 0
Регистрация: 30.10.2009
Сообщений: 27
03.05.2012, 16:05  [ТС]
BRcr, спасибо большое.

vxg, коэффициенты аппроксимации находились с помощью МНК, это с помощью того сайта реализовал, всё получилось, теперь передо мной стала задача выводить на график аппроксимирующие функции от всех заданных иксов, как это сделать было, я не понимал. Честно вам сказать, сколько я не провел дней за чтением числовых методов, я всё равно ничего не понял про аппроксимацию.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru