Я написал следующий код в качестве реализации метода secant. Это происходит на Java, но в основном можно перевести на аналогичные языки, такие как C++ (и C, если вы игнорируете исключения).Реализация секущего метода для поиска корня функции
public interface Function
{
public double f(double x);
};
public class Secant
{
public static double find(Function f, double a, double b, double epsilon)
{
double fa = f.f(a), fb = f.f(b);
if (fa == fb) throw new IllegalArgumentException();
double c = b - ((fb * (b - a))/(fb - fa));
if (Math.abs(c - b) > epsilon) return find(f, b, c, epsilon);
else return c;
}
};
В этом коде (е) представляет собой класс реализации интерфейса Function, (а) предыдущее приближение корня, (б) представляет собой текущее приближение корня и (эпсилон) является , насколько я понимаю, максимальная разница между двумя последними приближениями для метода, который должен быть закончен. Если я верю в это, не проверял, будет ли | c-b | превышает (epsilon) трюк?
Это, кажется, работает хорошо для обычных функций, таких как х^2 + 2x + 1 но проблема возникает, когда я пытаюсь запустить найти с функцией возвращающей Math.log (х) - это корень находит NaN.
Есть ли что-то не в порядке с моим кодом или я просто неправильно понимаю фактическую математику? Я был бы признателен, если бы кто-то пролил свет на этот вопрос.
Просто любопытно, есть ли причина, по которой вы выбрали рекурсию, а не только цикл while, пока алгоритм не сходится? – paisanco
Выполнение этого «catch (Exception e) {throw e;}» бесполезно; e уже загружается, вы можете полностью удалить блок try. –
Извините: 'epsilon' - разница _minimum_? Разве это не было бы максимальной разницей? –