Obliczanie całki C++

0

Nie wiem jak zrobić żeby obliczanie całki wykonywało się dla dowolnej funkcji, którą będę mógł ustalić w konsoli a nie tak jak teraz ma miejsce w kodzie 'cos(x)'

#include <iostream>

using namespace std;


double f(double x) // wzor funkcji 
{
	return cos(x);
}

int main()
{
	const int N = 10;
	double xp, xk, st, s, dx, x;
	int i;

	cout.precision(2);    
	cout.setf(ios::fixed);  

	cout << "Podaj poczatek przedzialu calkowania: ";
	cin >> xp;

	cout << "Podaj koniec przedzialu calkowania: ";
	cin >> xk;
	
	s = 0; st = 0;
	dx = (xk - xp) / N;

	for (i = 1; i <= N; i++)
	{
		x = xp + i * dx;
		st += f(x - dx / 2);
		if (i < N) s += f(x);
	}

	s = dx / 6 * (f(xp) + f(xk) + 2 * s + 4 * st);
	cout << "Wartosc calki: " << s << endl;
	
	system("pause"); 
	return 0;

1

Wydziel całkowanie jako takie do osobnej funkcji, i niech ta funkcja przyjmuje wskaźnik na funkcję, którą całkujesz. Wtedy możesz pozwolić użytkownikowi wybrać funkcję.

0

@kq: Dzięki za szybką odpowiedź, ale nie mam pojęcia jak to zrobić

3
double integrate(double (*f)(double), double a, double b, int n)
{
    .....
}
1

Jeśli to co podał MarekR22 to jeden krok za daleko to zacznij od funkcji całkującej po przedziale używającej Twojej f, a uzmiennienie f zostaw sobie na potem.

0

Bawię się, ale nie wiem czy to nie przerasta moich aktualnych umiejętności.

0

W przekazywaniu wskaznika na funkcje chodzi o to, ze twoja funkcja nie robi czegos bezposrednio, tylko wykonuje funkcje, ktora sama otrzymala jako parametr. Dzieki temu mozesz elastycznie wykonywac kod bez wprowadzania zbyt wielu zmian. Ponizej przyklad

#include <stdio.h>

double add(double val) {
  return val + 1;
}

double sub(double val) {
  return val - 1;
}

double fun(double (*fun_ptr)(double), double val) {
  return (*fun_ptr)(val);
}

int main() {

  printf("%f\n", fun(&add, 1));

  printf("%f\n", fun(&sub, 1));

}

Ta deklaracja:

double fun(double (*fun_ptr)(double), double val)

mowi tyle: fun jest funkcja, ktora zwraca double a jako argumenty przyjmuje:

1 argument: wskaznik na funkcje, ktora przyjmuje jako argument double i zwraca double
2 argument: wartosc double

Natomiast: (*fun_ptr)(val) oznacza: wywolaj funkcje, ktora jest wskazywana przez fun_ptr i przekaz do niej wartosc val.

Dzieki temu, mozesz elastycznie przekazywac co ma byc liczone i nie musisz tego hardcodowac.

0

Nie wiem jak to zrobić. Chciałbym żeby działał ten program na takiej zasadzie jak na ss, możliwość wpisania wzoru funkcji.
screenshot-20210118153034.png

0

Mógłby mi ktoś napisać taki program, a ja bym przeanalizował co robię źle.

0

To czego potrzebujesz to http://warp.povusers.org/FunctionParser/fparser.html. Chyba że chcesz napisać własną wersję parsera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1