Ich schreibe ein Programm, um die Wurzeln von Funktionen mit irrationalen Wurzeln numerisch durch verschiedene Methoden zu finden. Für Verfahren wie lineare Interpolation, müssen Sie hierfür den ungefähren Bereich, in dem eine Wurzel liegt, finden ich diesen Code geschrieben:Suche nach Wurzeln, aber nicht nach Asymptoten einer Funktion
bool fxn1 = false;
bool fxn2 = false;
vector<float> root_list;
if(f_x(-100) < 0)
{
fxn2 = true;
}
for(float i = -99.99; i < 100.01; i += 0.01)
{
fxn1 = fxn2;
if(f_x(i) < 0)
{
fxn2 = true;
}
else
{
fxn2 = false;
}
if((fxn1 == false && fxn2 == true) || (fxn1 == true && fxn2 == false))
{
root_list.push_back(i-0.01);
root_list.push_back(i);
}
}
jedoch für nicht-stetige Funktionen (dh Funktionen mit Asymptoten), das Code wird auch ausgelöst, wenn die Funktion von beiden Seiten der Asymptote von positiven zu negativen Werten wechselt. Gibt es eine Möglichkeit, das Programm den Unterschied zwischen einer Wurzel und einer Asymptote zu unterscheiden?
Dank im Voraus
Das ist nicht wirklich ein Programmierproblem, sondern ein mathematisches Problem. Aber eine Asymptote hat die Eigenschaft, dass sie ins Unendliche abläuft, also wenn 'f_x (i) <0 ', dann sollten Sie' f_x (i + 0.005) haben f_x (i) '. –
CompuChip
Beachten Sie auch, dass Sie beide "if" -Anweisungen durch die kürzere ersetzen können: fxn2 = f_x (i) <0; if (fxn1! = fxn2) {...} ', ersetzt 9 Zeilen durch 2. – CompuChip
Anstatt der Vorzeichen, sehen Sie sich einfach den absoluten Wert an und sehen Sie, ob er klein genug ist. –