Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Нахождение корней уравнения методом дихотомии Java

Столкнулся с небольшой проблемой: (краткая формулировка вопроса дана в самом конце) у меня имеется функция, например, такая: (N = 1 для этого варианта) Их много разных, и все они такие "красивые". График у неё ещё красивее: Так вот, мне необходимо все точки пересечения графика с осью абсцисс (корни уравнения) выделить цветом, и найти эти корни методом дихотомии. Сам алгоритм сложностей не вызвал:
while (right - left > epsilon){ tmp = (right - left)/2;
if (get_Y_for_X(right) * get_Y_for_X(tmp) < 0) { left = tmp; } else { right = tmp; }
root = (left + right)/2; }
Однако, мне нужно проделать это многократно, и найти каждый корень. Как я понимаю, с помощью данного алгоритма можно найти только один корень в заданном промежутке [left, right]. Значит, мне нужно знать все промежутки, в которых находятся корни, и уже в них искать? В общем, я не очень понимаю, как подойти к решению. Буду рад помощи. Возможно, я не увидел какого-то элементарного момента или не додумался до чего-то простого.

Думал следующим образом: раз с помощью алгоритма, написанного сверху, можно найти корень на заданном промежутке (в задании конкретно для этой функции у меня указан промежуток [-4, 4] и epsilon = 0.0001) то я могу разбить его на много промежутков, например, длиной в l = 1 или l = 0.5, и на каждом найти эти корни, записать их и потом уже отметить на графике. То есть, добавлялся еще один цикл while сверх того алгоритма, и выполнялся он длина промежутка / l раз, и затем left = предыдущий right, right = предыдущий right + l, в общем, тут всё предельно просто, однако, опять же загвоздка в том, что корней на этих промежутках может быть гораздо больше одного, а может и не быть вообще. Ведь мне нужно не просто реализовать метод дихотомии, а найти все корни этим методом. К тому же, один пункт в задании меня немного озадачил: нужно будет, также, найти интеграл на промежутке от 2 до 3 корня на графике. Посмотрев на получившийся график, я так и не понял, откуда вести отсчёт, от левой границы или от нуля, и какой корень считать первым, чтобы найти второй и третий. В любом случае, получается не очень хорошо. В указаниях к заданию есть пример сделанной программы (крайне убогий), и, судя по графику, который с помощью неё нарисован, там была использована далеко не такая функция, какая дана в задании, и составители заданий не позаботились об этом. Либо, опять же, я где-то в начале не учёл что-то и зря ищу виноватых.

Для тех, кто напишет "оченьмногобукв", или как-то по-иному возмутится насчёт чрезмерно длинной формулировки вопроса: я всегда стараюсь как можно подробнее поставить вопрос, чтобы тем, кто захочет мне ответить, было всё понятно сразу, а также, стараюсь осветить все стороны своего вопроса. Но, всё же, сделаю ещё так:
Выше дана моя функция, мне нужно методом дихотомии найти все корни этого уравнения на промежутке [-4, 4] с точностью до 0.0001. То есть, мне нужны Х и Y всех точек, которые будут корнями уравнения. Нуждаюсь в помощи с реализацией алгоритма по нахождению этих корней.


Ответ

Проблему отделения корней в данном случае решает подстановка
t = x4 sign(x), x = |t|1/4 sign(t),
вид функции z(t) = y(x(t)) приведён в скриншоте программы MathCAD
(интервал первого графика x = [ - 41/4, 41/4]):

Экстремумы функции f(t) = sin 16t достигаются в точках
Ti = (2i+1)*Pi/32
и хорошо отделяют корни функции z(t).
Анализ значений экстремумов (таблица в скриншоте) с учётом равенства z(0)=1 показывает, что на интервале (0, 1.9) z(t)>0, т.е. корней нет.
Следует учесть, что при x = [-4,4] t = [-256, 256].

Комментариев нет:

Отправить комментарий