Это пример оптимизации метода Ньютона-Рафсона.
Я получаю сообщение об ошибке при компиляции:
определение функции здесь не допускается до токена ‘{‘
Он указывает на первую строку первой функции.
Любая помощь?
заранее спасибо
#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;
}
Вы не можете иметь функцию внутри функции в C ++.
Единственный обходной путь — использовать лямбды из c ++ 11:
int main()
{
auto my_fun= []() { return 69; };
my_fun();
}
Также старайтесь избегать сырых указателей. С ними легко ошибиться. Придерживайтесь smart_pointer — отличный способ обеспечить надежное и безопасное распределение памяти.
Вот пример из книги Дж. Сида, который может быть вам полезен.
первый файл заголовка для метода Ньютона-Рафсона
#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;
}
}
Также вы должны поместить свою единственную функцию в глобальную область видимости, как было отмечено в комментарии ERic.