2015-08-27 4 views
-2

Это пример оптимизации метода Newton-raphson. я получаю сообщение об ошибке при компиляции:Пример оптимизации C++

функция разрешения не допускается здесь до «{» лексема

Это указывает на первой строке первой функции.

Любая помощь? спасибо заранее

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <vector> 
#include <numeric> 
#include <iterator> 
#include <map> 
#include <string> 

//C++ clang 

using namespace std; 

int main() 
{ 
    //Optimization Example 

    void getF(double* X, double *F) 
    { 
     F[0]=X[0]*X[0]+X[1]*X[1]-4; 
     F[1]=-X[0]*X[0]/3+X[1]; 
     return; 
    } 

    void Jacobian(double* X, double** H) 
    { 
     H[0][0]=2*X[0]; 
     H[0][1]=2*X[1]; 
     H[1][0]=-2/3*X[0]; 
     H[1][1]=1; 

     return; 
    } 

    unsigned int maxSteps=1000; 
    double epsilon=0.00001; 
    double* X=new double[2]; 
    double* F=new double[2]; 
    double** H= new double*[2]; 
    for (unsigned int i=0 ; i<2 ; i++) 
    { 
     H[i]=new double[2]; 
    } 

    cout << "Solution : " << endl; 
    cout << "x = " << X[0] << endl; 
    cout << "y = " << X[1] << endl; 

    delete[] X; 
    delete[] F; 

    for (unsigned int i=0 ; i<2 ; i++) 
    { 
     delete[] H[i]; 
    } 
    delete[] H; 

} 
+0

Переместите функции (getF, якобиан) за пределы функции main(). Поместите их в глобальную сферу. Если вы не хотите их в глобальном пространстве имен, поместите их в обычное пространство имен C++ или в анонимное пространство имен (просто окружите их {}). –

+0

Большое спасибо! проблема решена – JasBeck

+2

Название вашего вопроса не имеет отношения к тому, что вы заявляете. Не могли бы вы обновить свой титул? – Misgevolution

ответ

3

Вы не можете иметь функцию внутри функции в C++. Единственный способ решения проблемы заключается в использовании лямбды от C++ 11:

int main() 
{ 
    auto my_fun= []() { return 69; }; 
    my_fun(); 
} 

Кроме того, старайтесь избегать сырых указателей. Его легко сделать с ними ошибку. Приклеивание к smart_pointer - отличный способ обеспечить надежное и безопасное распределение памяти.

1

Вот пример из книги Г.Сида, может быть вам полезен.

первый файл заголовка для метода Ньютона-Рафсона

#ifndef _NR_H 
#define _NR_H 
#include <cmath> 
void NewtonRaphson(double (*f_ptr)(double), 
          double (*df_ptr)(double), int n_iterations, 
          double tolerance, double xO, double& x_new, 
          int& count, bool& converged); 
#endif 

Тогда функция сама

#include "nr.h" 
void NewtonRaphson(double (*f_ptr)(double), double (*df_ptr)(double), 
        int n_iterations, double tolerance, double xO, double& x_new, 
        int& count, bool& converged) { 
    double x_old (xO); 
    count = 0; 
    converged = false; 

    for (int i = O; i < n_iterations; i++) { 
     count++; 
     x_new = x_old - (f_ptr(x_old)/ df_ptr(x_old)) ; 

     if (fabs(x_new - x_old) < tolerance) { 
      converged = true; 
      break; 
     } 
     else 
     x_old = x_new; 
    } 
} 

Кроме того, вы должны поставить одну функцию в глобальном масштабе, как это было указано в комментарии Эриха.

+0

Этот материал даже не компилируется ... –

+0

@NIK Bouglis Попробуйте сейчас, я проверил все ошибки. –

Смежные вопросы