singlepost

Разрыв функции. Вертикальная Асимптота. << На главную или назад  

Задание: построить график заданной функции на заданном интервале.
И мне здесь стало интересно. Пусть в задании функции непрерывные на заданных интервалах, но!
Возможно есть какой-то метод обнаружения разрыва. Просто при проходе функции – при разрыве может возникнуть деление на ноль (1/х при x=0) или при захождении аргумента функции за рамки области определения функции (ln(x) при х<=0) и тп.
Из прочитанного я немного понял, что это можно сделать через отключение дирректив.
На местах разрыва в точках(если ветви устремляются в бесконечность) я бы построил вертикальные асимптоты.
Не могли бы вы внести ясность в данный вопрос.

66 ответов в теме “Разрыв функции. Вертикальная Асимптота.”

  1. 31
    Алексей Шишагин ответил:

    о боже) ты админ группы…да еще и с фтк))в одном инсте обучаемса)
    фтк…фтк…

  2. 30
    Жека Кирпичев ответил:

    Так. Задача состояла в том, чтобы найти у функции точки разрыва.
    Это НЕВОЗМОЖНО сделать, вычисляя функцию в конечном числе точек – т.к. разрыв может оказаться в какой-то точке, которую мы проглядели.
    Найти точки разрыва можно лишь анализируя функцию "саму по себе" – ее выражение. Но это безумно сложно и пытаться написать это самому – безнадежная трата времени.
    Я, собственно, об этом всю тему и говорю :)

  3. 29
    Алексей Шишагин ответил:

    прога строит любые графики…это не решение задачи?=)
    А если уж прямо по теме,допустим когда мы приходим в точку разрыва,происходит прерывание процессора,вызывается стандартная функцияя materr(или на других компиляторах что то подобное),которая грохает программу.
    Нам такой расклад не подходит,поэтому с помощью довольно хитрых манипуляций мы пришем свою функцию myMaterr,которая обеспечивает нормальную работу приложения в ситуациях типа(деление на ноль,корень,логарифм…итд)и возвращает тип ошибки,и подменяем ее стандартную…дальше уже идет рисование…
    Анализ функции безумно неэффективен
    Взять тот же корень из выражения,для начала нам какимто образом надо определить что наша функция содержит корень,потом на каждом шаге проверять что подкоренное выражение >0 и еще наверно много чего,ладно если выражение состоит только из корня,а если что то типа 1/x-sqrt(ax+b) ?
    Другой момент если вы считаете выражение парсером…там еще можно чето намудрить…а так…ну хз=))) не меньше миллиона страниц!=)

  4. 28
    Жека Кирпичев ответил:

    Вот только ничего про детектирование разрывов и вообще про какой-либо анализ свойств функции в этих 11кб нет – то есть, задачу автора сего топика он не решает. Поэтому там и не миллион страниц.

  5. 27
    Алексей Шишагин ответил:

    Петр,если хватит сил переколбасить это под паскаль,тогда вам повезло))(там всего 11 кб=)))а не миллион страниц кода)
    //depositfiles.com/ru/files/4931372
    (Папака с проектом на чистом Си(Visual Studio 6.0))
    На заметку…к проекту подключен саппортовый файл для графики…он важен,ибо без него рисование не пашет…

  6. 26
    Ден Савченко ответил:

    Надо внимательно почитать учёбники. Если там написано, что однозначно определяется ТАК, то это ТАК и надо вычислять… Погрешность, ясен пень, будет, но что поделать….

  7. 25
    Жека Кирпичев ответил:

    > Я могу численно взять производную и посмотреть значение, вот не помню, возможно ли для второй производной это сделать.
    Можешь. Но если ты, скажем, берешь численную производную с dx = 0.00001, то ты запросто можешь не заметить разрыва, находящегося где-нибудь посередине этого интервала dx. В этом и есть главная проблема.

    > Значит, есть и алгоритмы анализа, которые в них реализованы.
    Эти алгоритмы очень круты и занимают сотни страниц кода, но даже они не универсальны.

    > Считаете ли вы так или у вас есть другие предложения?
    Я совершенно согласен, что проверяя допустимость аргументов примитивных функций, можно выяснить, определена ли функция в заданной точке. Более того, если повезет, то можно и определить тип разрыва, зная тип разрыва примитивной функции в данной точке и каким-то образом комбинируя его с остальной частью выражения – например, если в знаменателе выражения – примитивная функция, имеющая разрыв первого рода и уходящая в бесконечность, то все выражение имеет разрыв второго рода.

    Но если задача состоит в том, чтобы найти ВСЕ разрывы функции – то мы упираемся в вышеописанную проблему – разрыв очень легко пропустить, если он узкий и нам не повезет случайно уткнуться в него при построении графика.

  8. 24
    Ден Савченко ответил:

    дак при закладке ОДЗ нужно указывать тип границы – входит ( или не входит [ точка… так и определять.

  9. 23
    Пётр Ермаков ответил:

    а. вот ещё загвоздка.
    в методе MAX_VALUE…
    а если задана граница, и в точке являющийся началом границы функция не существует?

  10. 22
    Олег Агапов ответил:

    в серьёзных приложениях расматриваються границы функции в точках.
    таким образом обходяться разрывы первого рода, а-ля sin(x)/x, и соотвтсвенно обнаруживаються разрывы второго рода.

  11. 21
    Ден Савченко ответил:

    2 Алексей Федоров – тогда поточнее запишите функцию! В Си запись х*х/х равна именно х. Это (x^2)/x или x*(x/x). Или что-то другое?

    2 Жека jkff Кирпичев
    >логарифм и корень не существуют, когда их аргумент меньше нуля (соответственно, надо уметь решать неравенства);

    Существует корень. Только он комплексный: sqrt(-1) = i

    >Определить какие-либо свойства функции – в т.ч. типы разрывов – не производя символьных манипуляций с ней, т.е. чисто численно – невозможно; можно их только "заподозрить".

    А почему нет? Я могу численно взять производную и посмотреть значение, вот не помню, возможно ли для второй производной это сделать.

    Вообще все вопросы решаемы. Есть же маткад с матлабом? Значит, есть и алгоритмы анализа, которые в них реализованы.

  12. 20
    Пётр Ермаков ответил:

    2 Жека jkff Кирпичев
    Ладно. Но вот я рассмотрел в предыдущем сообщении алгоритм(грубо говоря), как заподозрить функцию на разрыв или недопустимый аргумент. Считаете ли вы так или у вас есть другие предложения? Мне действительно интересно ваше мнение.

  13. 19
    Жека Кирпичев ответил:

    Петр, повторюсь: Определить какие-либо свойства функции – в т.ч. типы разрывов – не производя символьных манипуляций с ней, т.е. чисто численно – невозможно; можно их только "заподозрить". Определить эти свойства, производя символьные манипуляции – ОЧЕНЬ сложно (возможно, придется написать полноценную систему компьютерной алгебры), но во многих практически важных случаях возможно.

  14. 18
    Алексей Шишагин ответил:

    есть вариант на Си..кого интересует(обрабатывает все,кромне floor)

  15. 17
    Пётр Ермаков ответил:

    Я всё равно считаю, что машина уступает человеку. Человек сам способен решать всё это, да и не только это. Конечно не всякий человек.
    А вот "Mathematica ". Мне вот и интересно, как реализовать построения асимптот, точек разрыва и обходить участки, где функция не существует.
    По поводу обхода у меня есть идея. Загнать в машину элементарные функции и их ОДЗ. Так как выражение я буду смотреть через ОПН, можно на шагах взятия элем. функции определять, входит ли аргумент функции в её ОДЗ. Но проблема с точками разрыва не решается. То есть мы их обходим, но не определяем, точка разрыва ли это или точка, где функция не существует. Если точка разрыва, то, что за разрыв?! Можно определить разрыв второго рода. А если нет?! То значит первого.
    Возможно как-то так. А может, есть другое предложение.

  16. 16
    Жека Кирпичев ответил:

    А машина тоже не может, в общем случае.
    Но в частных случаях – структурная рекурсия: например, рациональные функции не существуют, когда знаменатель обращается в ноль (надо уметь искать нули полиномов – это возможно лишь для полиномов ниже 5 степени); логарифм и корень не существуют, когда их аргумент меньше нуля (соответственно, надо уметь решать неравенства); рациональная функция меньше нуля если у числителя и знаменателя разные знаки; f(a, b, c, …) определено и неразрывно только если определены a, b, c, … – и т.п.

    Короче, запасшись большим количеством алгоритмов символьной алгебры, можно решить некоторый класс задач.. Работает же как-то Mathematica :) Она, вроде, с 6 версии начала строить асимптоты и точки разрыва на графиках функций.

  17. 15
    Пётр Ермаков ответил:

    2 Жека jkff Кирпичев
    Исходная задача решена.
    А по поводу человека и машины…
    "Если на выражение, то неверно"
    Мне интересно как машина может определить, где функция существует, а где нет?

  18. 14
    Жека Кирпичев ответил:

    > В логарифме и нет разрыва
    А я и не говорил, что есть – там есть асимптота :)

    > Это человек может посмотреть на функцию и сказать где она существует, а где нет
    Имеешь в виду на график или на выражение? Если на выражение, то неверно; если на график – то, мне кажется, человек подвержен в точности тем же самым проблемам, что и машина – может перепутать большой Y с бесконечным; или не заметить разрыв шириной меньше разрешения глаза. Увы, в общем виде задача нерешаема. Существуют лишь крайне трудоемкие символьно-численные методы, которые для большинства "неизвращенных" функций смогут найти разрывы.
    Лучше скажи, какая у тебя исходная задача, и какой класс функций может оказаться на входе – возможно, он достаточно узок, чтобы существовало точное решение.

  19. 13
    Пётр Ермаков ответил:

    2 Углурк РАБОТАЮ! Савченко
    Это всё ясно. Это человек может посмотреть на функцию и сказать где она существует, а где нет. У человека своя логика. Не всякий раз её можно переложить на машину. Сейчас я как раз и пытаюсь логику поиска разрывов и тп переложить на машинный код.

  20. 12
    Пётр Ермаков ответил:

    2 Жека jkff Кирпичев
    В логарифме и нет разрыва
    Просто на конкретном участке функция не существует.
    Если введён участок от -1 до 1 и функция ln(x).
    Начинаем обход и в первом же обходе цикла получаем ошибку.
    И метод через MAX_VALUE работает только если разрыв второго рода(на бесконечность).

    2 Углурк РАБОТАЮ! Савченко
    это действительно разные функциии. И в указанном мною примере это разрыв.

  21. 11
    Алексей Федоров ответил:

    2 Углурк РАБОТАЮ! Савченко
    здесь разрыв первого рода

  22. 10
    Алексей Федоров ответил:

    а f(x) = х*х/х иf(x) = x совершенно разные функции

  23. 9
    Ден Савченко ответил:

    На первом курсе матанализа учат исследовать функции и определять разрывы, а также строить асимптоты. Почитай //www.sseu.ru/edumat/v_mat/course1/razd3z1/par3...

  24. 8
    Ден Савченко ответил:

    f(x) = х*х/х => f(x) = x. Нету тут разрыва.

  25. 7
    Жека Кирпичев ответил:

    Насчет логарифма – ну необязательно искать асимптоту по пересечению нуля через бесконечность, достаточно просто поискать стремление к бесконечности.

    Ну а в общем случае – повторюсь и повторяю maxleo – только с помощью анализа самого выражения. Но и в этом случае можно только проверить, имеет ли функция разрыв в данной конкретной точке, но нельзя найти все разрывы.

  26. 6
    Антон Щиров ответил:

    Может так?
    try
    ___y := f(x);
    except
    ___// значение функции в точке х не определено
    end;

  27. 5
    Леонид Максимов ответил:

    отключение ошибки деления на 0. модно звучит :)

    теперь по теме:
    если есть желание находить и отображать все особенности функции, то придется использовать анализ выражений, в которых функция задана.

  28. 4
    Пётр Ермаков ответил:

    Или вот ещё пример.
    f(x) = х*х/х
    В точке ноль никакого стремления нет, но разрыв в нуле имеется.

  29. 3
    Пётр Ермаков ответил:

    2 Леонид maxleo Максимов
    Делфи.
    Можно к примеру (хотя это не проверенные сведения) отключить ошибку деление на ноль (т.е. чтоб программа не вылетала при делении на ноль) и самому её(ошибку) обработать.

    2 Жека jkff Кирпичев
    Да, это сработает, когда мы справа приближаемся к числу (например 0 если функция 1/х). Когда значение функцкиии становится меньше MIN_VALUE, потом округляем х+dx до ближайшего целого (ясно что это будет ноль) и добавляем к ниму dx, пока значение функции не станет меньше MAX_VALUE и дальше продолжаем строить график. Обошли разрыв.
    В этот раз это сработает. Но вот что делать с логарифмом, когда у нас не просто точка разрыва. На полуинтервале от минус беск до 0 значение аргумента не допустимо.

  30. 2
    Жека Кирпичев ответил:

    В общем случае невозможно определить, стремится ли функция в данной точке в бесконечность.
    Если функция задана выражением – то возможно и даже не очень трудно – с помощью стандартных методов высшей математики.
    Для практических целей вполне достаточно смотреть, не происходит ли такого, что f(x) < -MAX_VALUE, а f(x+dx) > MAX_VALUE, где MAX_VALUE – какое-то здоровое число.

  31. 1
    Леонид Максимов ответил:

    > отключение дирректив

    что это? может быть вы назовете язык?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.