Stavo cercando un algoritmo di bisezione per risolvere e^x+x=0 quando ho perso la notte a cercare una formula esplicita per divisioni infinite di intervalli del tipo [a,b] come a<(7a+b)8<(3a+b)/4<(5a+3b)8<(a+b)/2<(3a+5b)/8<(a+3b)/4<(a+7b)/8<b ma l'ho trovata solo andando sempre a destra o a sinistra come [(? con 0, 2^n)a+b] 2^n e mi sono accorto che non serve a niente se sto programmando, quindi nel programma voglio scrivere una cosa simile:
Codice:
for[int i=1; i<10; i++]
{
if f(x)f(x+y /2)<0
y= x+y /2
else x= x+y /2
}
In quanto il teorema dell'esistenza degli zeri dice che se ho una funzione continua definita in un intervallo [x,y] e f(x)f(y)<0, cioè un estremo sta sopra e uno sotto, allora deve esserci un punto z di [x,y] tale che f(z)=0. Nel metodo sopra vorrei dividere sempre a metà l'intervallo, ogni volta scegliendone uno che contenga la z. Solo che non mi ricordo niente dei puntatori a funzione e quando cerco di stendere il programma mi viene una cosa simile, oltretutto sbagliata:
Codice:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double f=100;
double g=-99;
for (int i=10; i<10; i++)
{
if ((2,71828^((f+g)/2)+(f+g)/2)(2,71828^g+g)<0)//ho direttamente inserito i valori in e^x+x
f=(f+g)/2
else g=(f+g)/2
}
return 0;
}