Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 3
1

Аппроксимация с alglib

15.01.2015, 17:29. Просмотров 2150. Ответов 4
Метки нет (Все метки)

Всем добрый день. Решила поразвлечься с пакетом alglib и попыталась опробовать пример аппроксимации методом Левенберга-Марквардта с использованием градиента.

Что есть: пример в мануале, с которого всё слизано, свои данные для тренировки (просто массив из 31 числа, лежащих вдоль кривой Гаусса с небольшим разбросом, сигма=1, мю=0, прилагает в txt-файле) и пачка ошибок после реализации.

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
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <fstream.h>
#include <math.h>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#include "interpolation.h"  
#include "stdafx.h"
#include "optimization.h"
 
using namespace alglib;
 
double x[31]={0};
double y[31]={0};
real_1d_array c="[1,0]";
 
double Get_Array() //здесь я читаю из файла свои данные, всё ок, работает
{
 
    char buf[1000]={0};
    FILE *tab;
 
 
    float num1;
    float num2;
 
    strcpy(buf,"D:\\pub\\Bagrova\\Proc_Fit\\sGauss.dat");
    tab=fopen(buf,"r");
 
    if (tab)
    {
        fgets(buf,1000,tab);
        for (int i=0; i <= 30; i++)
        {
            fscanf(tab,"%f%f\n", &num1,&num2);
            x[i]=num1;
            y[i]=num2;
        }
    fclose(tab);
    }
    else printf("Error open");
    printf("\tX\ty\n");
    for (int i=0; i <= 30; i++)
    {
        printf("%f\t%f\n",x[i],y[i]);
    }
    getche();
    return 1;
}
void  gauss_func(const real_1d_array &c, const real_1d_array &x, double &func, void *ptr)
{
    func=exp(0-pow(x[0]-c[1],2)/(2*pow(c[0],2)))/pow(2*M_PI,0.5); //c[0] - sigma, c[1] - mu
}
 
void gauss_grad(const real_1d_array &x, double &func, real_1d_array &grad, void *ptr)
{
    func=exp(0-pow(x[0]-c[1],2)/(2*pow(c[0],2)))/pow(2*M_PI,0.5);
    grad[0]=pow(x-c[1],2)*exp(0-pow(x[0]-c[1],2)/(2*pow(c[0],2)))/(pow(2*M_PI,0.5)*pow(c[0],4))-exp(0-pow(x[0]-c[1],2)/(2*pow(c[0],2)))/(pow(2*M_PI,0.5)*pow(c[0],2));
    grad[1]=(x-c[1])*exp(0-pow(x[0]-c[1],2)/(2*pow(c[0],2)))/(pow(2*M_PI,0.5)*pow(c[0],3));
 
}
 
int lsFit_FG()
{
    real_2d_array X1 = "[[-3],[-2.8],[-2.6],[-2.4],[-2.2],[-2],"
    "[-1.8],[-1.6],[-1.4],[-1.2],[-1],[-0.8],[-0.6],[-0.4],[-0.2],[0],[0.2],[0.4],"
    "[0.6],[0.8],[1],[1.2],[1.4],[1.6],[1.8],[2.0],[2.2],[2.4],[2.6],[2.8],[3]]";
    real_1d_array Y1;
 
    Y1.setcontent(31,y);
 
    double epsf = 0;
    double epsx = 0.000001;
    ae_int_t maxits = 0;
    ae_int_t info;
    lsfitstate state;
    lsfitreport rep;
 
    lsfitcreatefg(x, y, c, true, state);
    lsfitsetcond(state, epsf, epsx, maxits);
    alglib::lsfitfit(state, gauss_func, gauss_grad);
    lsfitresults(state, info, c, rep);
    printf("%d\n", int(info)); // EXPECTED: 2
    printf("%s\n", c.tostring(1).c_str()); 
 
    return 0;
}

Ошибки возникают следующие:
стр. 62 [C++ Error] UnitFIT.cpp(120): E2094 'operator-' not implemented in type 'real_1d_array' for arguments of type 'double'
стр. 63 [C++ Error] UnitFIT.cpp(121): E2094 'operator-' not implemented in type 'real_1d_array' for arguments of type 'double'
стр. 83 [C++ Error] UnitFIT.cpp(154): E2285 Could not find a match for 'lsfitcreatefg(double *,double *,real_1d_array,bool,lsfitstate)'
стр. 85 [C++ Error] UnitFIT.cpp(156): E2285 Could not find a match for 'lsfitfit(lsfitstate,void (*)(const real_1d_array &,const real_1d_array &,double &,void *),void (*)(const real_1d_array &,double &,real_1d_array &,void *))'

Пока что не понимаю, что с этим делать.
0
Вложения
Тип файла: txt sGauss.txt (415 байт, 6 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2015, 17:29
Ответы с готовыми решениями:

Alglib C++ Qt
Пытаюсь запустить простой пример по мануалу с официального сайта ...

ALGLIB. Интерполяция.
Здравствуйте! Необходимо проинтерполировать массив. Для такого дела подключил библиотеку ALGLIB. Я...

Работа с alglib
Здравствуйте. Пытаюсь начать работу с библиотекой alglib. Из поверхностного знакомства понял, что...

Установка ALGLIB
Пишу на с# Для диплома необходима работа с матрицами. А именно SVD преобразование. Пытался...

4
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 3
15.01.2015, 18:58  [ТС] 2
Последняя ошибка ликвидирована, это была просто невнимательность.
C++
1
void gauss_grad(const real_1d_array &c,const real_1d_array &x, double &func, real_1d_array &grad, void *ptr)
Остальные пока висят.
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.01.2015, 19:39 3
похоже на ошибки компоновки - значит либо не подключили что-то (какую-то библиотеку/хедер), либо неправильно вызываете функции
0
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 3
15.01.2015, 19:46  [ТС] 4
Сейчас висят только первые две ошибки. Слизано практически в точности с примера в мануале (http://alglib.sources.ru/trans... fit_d_nlfg), а все cpp-файлы библиотеки добавлены в проект.
И да, у меня Borland 2006.
0
591 / 529 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.01.2015, 19:52 5
наверное тут опечатка x-c[1], тогда
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2015, 19:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Работа с библиотекой AlgLib
Всем доброе время суток. Подскажите пожалуйста, можно ли использовать библиотеку ALGLIB в...

AlgLib: сложение матриц
Здравствуй, добрый человек! Просматривая документацию по AlgLib делаю вывод, что сложение и...

Специальные функции в Alglib
Здравствуйте, я начинающий программист в C++. Я пытаюсь написать программу, которая в вычислениях...


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

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

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