Я пишу программу, которая находит решения уравнения с использованием метода Ньютона.Мне нужно использовать указатели на функции, чтобы при необходимости можно было быстро заменить уравнение.
Указатели на функции работают до тех пор, пока мне просто нужно значение, возвращаемое функцией, но не когда я пытаюсь вызвать функцию, которая имеетуказатели на функции в качестве аргументов внутри другой функции.
#define _CRT_SECURE_NO_WARNINGS
#define M_PI 3.14159265358979323846
#define N 2
#include <stdio.h>
#include <math.h>
struct data{
double theta;
double gamma;
double M;
double epsilon;
double dx;
};
double funct(double, data);
double derivative(double, data, double(*f)(double, data));
double MST(double, data, double(*f)(double, data));
void main(){
double results[N];
data parameters;
parameters.gamma = 1.4, parameters.epsilon = 0.001;
printf("Podaj parametry:\nTheta = ");
scanf("%lf", ¶meters.theta);
printf("M = ");
scanf("%lf", ¶meters.M);
int index = 0;
for (int x = 0; x < M_PI / 2.; x++){
if (funct(x, parameters)*funct(x + 1, parameters) < 0){
results[index] = MST(x, parameters, (*funct)(x, parameters));
index++;
}
}
}
double funct(double sigma, data parameters){
return 2. / ((parameters.gamma + 1)*parameters.M*parameters.M*sin(sigma)*sin(sigma)) - tan(sigma - parameters.theta) / tan(sigma) + (parameters.gamma - 1) / (parameters.gamma + 1);
}
double derivative(double x, data parameters, double (*f)(double x, data parameters)){
double dx = 0.0001;
return (f(x + dx, parameters) - f(x, parameters)) / dx;
}
double MST(double sigma_0, data parameters, double(*funct)(double sigma, data parameters)){
double sigma_1 = sigma_0 - funct(sigma_0, parameters) / derivative(sigma_0, parameters, (*funct)(sigma_0, parameters));
while (fabs(sigma_1 - sigma_0) < parameters.epsilon){
sigma_0 = sigma_1;
sigma_1 = sigma_0 - funct(sigma_0, parameters) / derivative(sigma_0, parameters, (*funct)(sigma_0, parameters));
}
return sigma_1;
}
Я получаю ошибки в строках 31, 47, 50 в (*funct)
.
Ошибка: аргумент типа "double" внесовместим с параметром типа "double (*) (double x, data data)".