Как построить график неявной функции в эксель
Нарисовать на canvas, c++, pascal и т.п. график функции y = f(x) — проще простого. Выясняем ОДЗ аргумента и с определенным шагом вычисляем y(x). Ставим точку, и так далее.
А как быть с графиком f(x,y) = 0, если y(x) не выразить? Понимаю, что в общем случае, наверное, можно решить только перебором значений по плоскости. Какие есть частные решения? Нужен что-то вроде brain-storm. Заранее спасибо!
-
Перебор значений по x и по y с определенным шагом. Долго, но 100% :-)
Спасибо gribozavr. (не получилось почему-то в вопросе вставить ссылкой)
Получается что вам нужно найти пересечение поверхности z = f(x, y) с плоскостью z = 0.
Я знаю сюществуют специальные численные методы для нахождения этих контуров пересечения, нужно хорошенько в сети их поискать.
Если влоб, то можно воспользоваться градиентным методом. Отображаемая площадь делится на N точек (выше N — больше качество и трудозатратнее). Точки выбираются либо по рандому, либо сеткой с определенным шагом. Далее для каждой точки вычисляется ее градиент. Зная вектор градиента мы знаем примерно в какую сторону нужно перемещать точку, чтобы приблизить ее к z = 0. Величина шага перемещения точки тоже настраивается и зависит от z (ближе — медленнее). Точка перемещается и вся процедура повторяется до тех пор пока либо не достигнем z = 0 с заданной точностью, либо других условий останова (выход за пределы отображаемой области, лимит количества итераций).
Таким образом случайно выбранные точки с течением времени будут перемещаться к контурам пересечения с z = 0 и образовывать эти самые линии.
Спасибо за совет.
Возможно я мыслю поверхностно, но мне кажется, что решать 2Д задачку через 3Д — это как-то неординарно по меньшей мере… Даже не знаю, как искать.
В принципе, по первым курсам универа я помню, мы «рассекали» различные поверхности плоскостями, но получались контуры, которые так же неявно заданы. Например x^2+y^2+z^2 = 4 пересекаем плоскостью z = 0, получаем x^2 + y^2 = 4.
Немного поразмыслил…
> Зная вектор градиента мы знаем примерно в какую сторону нужно перемещать точку, чтобы приблизить ее к z = 0
Вектор градиента не факт, что ведет к z=0. Ведь z=0 не обязано быть локальным минимумом f(). Кроме того, f(x,y) при разных x и y может быть как положительным, так и отрицательным при одном и том же градиенте…
Локальные минимумы возможны, да. Это нормально и ничего страшного. Их полезно определять и останавливать вычисления в данной точке.
Если f(x,y) положительна, то нам нужен отрицательный градиент (на уменьшение z), а если f(x,y) отрицательна, то нам нужен положительный градиент (на увеличение z). Если знак градиента не тот, что нам нужен, то просто идем в противоположную сторону. По модулю градиенты могут быть равны, но нужно на знаки смотреть. Возможна только одна ситуация, где градиент нам ничего не говорит, это когда он равен нулю.
Да, вы правы! Метод безусловно имеет право на существование, не смотря на свои минусы. Наверное неимоверно долго выполняется. Для каждой точки нужно выполнить достаточно много итераций градиентного спуска. Может так случайно получится, что все точки сойдутся лишь к маленькой дуге из всего большого графика. Может так случится, что много точек пропадет в локальных минимумах так и не дойдя до нуля.
Но в целом — очень интересно. Классно было бы визуализировать такое построение и наблюдать, как точки расползаются и принимают форму какой-то кривой!
Скажите, как бы назвать такой метод применения градиентного спуска? Внесу в список :-) Я о таком, к своему стыду, не слышал.
У этого метода достаточно широкое поле для оптимизаций. Например, подсмотрел в документе, сначала выбираем K точек (K << N) и смотрим их знаки, может получится так:
— ---++---
--+++--
---++-+
-------+
------++
Если есть точки как положительные, так и отрицательные, то значит пересечение с z=0 на этом участке гарантированно есть. Теперь достаточно выбрать N точек только в области границ плюсов с минусами.
Из-за того, что K достаточно мало, какая-то маленькая область может пройти незамеченной. Для этого для всех K точек вычисляем векторы градиента и сравниваем попарно соседние вектора на коллинеарность и однонаправленность векторным умножением. Если их направление примерно одинаковое, то все нормально, если же оно сильно отличается, то значит между этими двумя точками что-то есть еще интересное и тоже требуется выбрать точек из числа N в этой областе.
После того как N точек выбрано, можно начать градиентный спуск для всех точек, но функцию выбрать не f(x,y), а |f(x,y)| — ее модуль. На пересечение с нулем это никак не повлияет, но вычисления облегчит. В этом случае задача сводится к обыденному поиску минимумов функции, они причем в большинстве своем будут острыми.
Метод можно назвать «поиск нулей функции градиентным методом (спуском)».<>
С модулем — хорошо. А что если брать f^2(x,y)? Тогда поиск нулей функции будет тем же самым почти, что поиск минимумов, где градиент — ноль.
Лучше взять модуль, а не квадрат и запустить любой из методов многомерной глобальной оптимизации. Для одномера подходит метод ломаных, который сходится ко всем минимумам. Для многомерного случая он называется метод Пиявского. Из универского курса могу вспомнить метод Хука-Дживса, метод Стронгина (один из лучших, но сложноват), метод деления на 3. Выбирайте любой метод оптимизации, который ищет все минимумы. Думаю, что оптимальнее эту задачу вы не решите.
Могу предложить немного изменить описанный выше подход с градиентами и 3хмерным описанием проблемы. Возьмите срезы по XZ для каждого Y, который соответствует пикселям на экране (надо помнить, что нам не надо расчитывать результат с точность, которая превышает разрешение монитора). Тогда каждый срез будет представлять из себя стандартную задачу по решению уравнения f(x)=0, тут уж можно какие-нибудь численные итеративные методы стандартные (метод ньютона например или что-то другое) использовать (которые по сути и используют градиенты в каком-то смысле). Проблемой с такими срезами будет то, что будут плохо отображаться горизонтальные линии. Можно попробовать последовательно делать с фиксированными Х и У, тогда должно получиться получше. Но все это мысли вслух так сказать, как бы я подходил к проблеме.
Возможно, я чего-то в алгоритме не понял. Я попробовал его применить, чтобы построить график уравнения
2*x*x-3*x*y-2*y*y-x+2*y=0 на квадрате [0,1]x[0,1] с разрешением 1024x1024. При этом глубину разбиения ограничил 30 шагами (т.е. интервальному алгоритму разрешалось спускаться только до квадратов со стороной 2^(-30) ). Программа тут же заявила, что 30 шагов ей мало (остаются красные пиксели), а всего (даже для неполного результата) потребовалось проанализировать 258 миллионов квадратиков. Правда, нарисовать итоговую картинку я еще не пытался.
А у Вас этот алгоритм заработал?
После небольшой правки с первым уравнением программа справилась (перебрав 8.6 миллионов квадратов, размером до 2^(-21)). Но вот построить график 9*x*x-6*x+9*y*y-1.25=0 ей не под силу: окружность касается прямой y=1/2 в точке, не являющейся двоично-рациональной. Доказать, что в смежном квадратике (где y>=1/2)есть точка кривой, интервальный метод не сможет :(
Конечно, если результат «много красного» допустим и кажется более ценным, чем «пропущены части графика, которые меньше ячейки сетки», то алгоритм имеет смысл применять — он дает хорошую оптимизацию на огромных (по числу ячеек мелкой сетки) площадях. Но надо хорошо подготовить функцию f к вычислению в интервальной арифметике, там разный порядок вычислений может дать очень разные по качеству результаты.
По-моему лучше пользователю показать где именно точные результаты, а где неопределённость, чем выдать результат, а корректности которого судить никак нельзя.
Зависит от цели и ресурсов. Научно правильное решение легко может оказаться стрельбой из пушки по воробьям. И кроме ожидаемого воробья выдать пользователю еще и стаю убитых комаров, которые тому совсем не нужны. Если программа будет 15 секунд гарантированно строить все компоненты графика, а потом еще 5 секунд выделять и выбраывать компоненты размером меньше порогового, то это будет несколько хуже, чем если она сза 0.1 секунду построит основную компоненту каким-нибудь эвристическим методом.
Можно сделать так. Если известна хотя бы одна пара соседних точек растра, на которых функция имеет разные знаки (например, f(x,y)>0, f(x+1,y) <0), то линия проходит межу ними. Можно взять один из квадратов, ограничивающих этот отрезок (например, (x,y)-(x+1,y)-(x+1,y+1)-(x,y+1) ), и, проверив знаки функции f(x+1,y+1) и f(x+1,y), узнать, какую вторую сторону квадрата пересечет график. Процесс продолжать, пока график не дойдет до границы области или не замкнется.
Для поиска стартовых точек можно взять значения в точках (Nx,Ny) при каком-нибудь N, и уже на этом растре искать соседние точки с разными знаками: график наверняка пройдет между ними. Маленькие компоненты при этом могут потеряться, но для их поиска пришлось бы использовать очень серьезные методы — например, решать систему f(x,y)=0, df(x,y)/dx=0 (ее решения дадут экстремальные точки всех компонент). Можно для этого применить метод Ньютона (тоже стартуя из всех точек (Nx,Ny)).
А насчет того, что перебирать все (x,y) долго, возникает вопрос — а какие требования? F(x,y) долго вычислять? Или разрешение экрана очень высокое? Или нужно какое-нибудь особое быстродействие (перерисовка в реальном времени)? Потому что в остальных случаях вычислить 10 миллионов значений функций не должно быть проблемой.
Действительно, для каких-то задач перебор всех х, у подойдет, поэтому этот метод я не вычеркиваю совсем. Но в моем случае — нужна, как вы говорите, перерисовка в реальном времени. Более того — нужно уметь подбирать такую f(x,y), которая бы по методу наименьших квадратов проходила ближе всего к заранее заданному массиву точек.
Тогда всесовсем просто. Для заданных точек найдется две, для которых f будет разных знаков, где-то между ними — отрезок, на котором f меняет знак (ищется за логарифм, делением пополам). А дальше — обход компоненты, как я написал. Общее время работы — линейное от длины кривой.
И где вы будете брать «точки»? В середине, в левом нижнем/левом верхнем/… углу? И тогда пропустите все части графика, которые меньше ячейки сетки? Прочитайте статью из моего ответа, всё совсем не просто, но вполне реализуемо и пугать необходимостью решать такие системы как вы говорите не нужно.
Есть ещё одно интересное соображение по трёхмерному решению, навеянное методом Хука-Дживса.
Пусть мы нашли одну точку нашего графика (например, рассмотрев сечение x = const и применив в нём метод Пиявского). Назовём эту точку опорной. Если предположить, что мы ищем одну непрерывную кривую, то можно утверждать, что рядом с найденной точкой есть другие, принадлежащие этой кривой. Возьмём некоторый шаг h и посчитаем значение функции F(x, y) в нескольких точках на расстоянии h от первой. Выберем точку со значением максимально близким к 0 за следующую опорную и повторим действия. Таким образом мы как бы пройдёмся по дну оврага (если брать модуль F) или просто по склону, сохраняя высоту.
Если хорошо подумать над тем как искать следующую точку, то можно сообразить как от начальной точки пройти сразу по двум направлениям (она же не обязательно будет на границе, и описанный выше метод найдёт кривую только по одну сторону от точки).
Получив массив точек, мы можем применить метод градиентного спуска для каждой из них для получения более точного результата. Так как точки уже близки к кривой, практически исключается возможность скатывания в локальные минимумы.
Вообще в методах глобальной оптимизации принято сначала локализовывать точки минимума, а потом запускать методы локальной оптимизации в найденных областях. Здесь это тоже неплохо работает.
Требуется на отрезке [-1; 4] построить график функции f(x). Параметры a = 5 и b = 2 необходимо задать в отдельных ячейках.
Решение (1 ряд данных)
Чтобы построить график функции в MS EXCEL можно использовать диаграмму типа График или Точечная.
СОВЕТ : О построении диаграмм см. статью Основы построения диаграмм в MS EXCEL . О различии диаграмм Точечная и График см. статью График vs Точечная диаграмма в MS EXCEL .
Создадим таблицу с исходными данными для x от -1 до 4, включая граничные значения (см. файл примера, лист Ряд1 ):
Шаг по х выберем равным 0,2, чтобы график содержал более 20 точек.
Чтобы построить диаграмму типа Точечная:
- выделите любую ячейку таблицы;
- во вкладке Вставка в группе Диаграммы выберите диаграмму Точечная с прямыми отрезками и маркерами .
Чтобы построить диаграмму типа График:
- выделите любую столбец f(x) вместе с заголовком;
- во вкладке Вставка в группе Диаграммы выберите диаграмму График маркерами .
У обеих диаграмм один общий недостаток - обе части графика соединены линией (в диапазоне х от 1 до 1,2). Из этого можно сделать ошибочный вывод, что, например, для х=1,1 значение функции равно около -15. Это, конечно же, не так. Кроме того, обе части графика одного цвета, что не удобно. Поэтому, построим график используя 2 ряда данных .
Решение (2 ряда данных)
Создадим другую таблицу с исходными данными в файле примера, лист График :
У такой диаграммы имеется недостаток - в диапазоне х от 1 до 1,2 на диаграмме теперь нет вообще значений. Чтобы избежать этого недостатка - построим диаграмму типа Точечная с 3-мя рядами данных.
Решение (3 ряда данных)
Для построения графика используем 2 таблицы с данными для каждого уравнения, см. файл примера, лист График .
Первое значение второго графика возьмем чуть больше 1, например, 1,00001, чтобы как можно ближе приблизиться к значению, в котором происходит разрыв двух графиков. Также для точки со значением х=1 построим на диаграмме одну точку (ряд №3), чтобы показать, что для этого х значение второго уравнения не вычисляется (хотя фактически вычисляется).
В качестве первого примера для Excel рассмотрим самую популярную функцию F(x)=X^2. График от этой функции в большинстве случаев должен содержать точки, что мы и реализуем при его составлении в будущем, а пока разберем основные составляющие.
-
Создайте строку X, где укажите необходимый диапазон чисел для графика функции.
Если график должен быть точечным, но функция не соответствует указанной, составляйте его точно в таком же порядке, формируя требуемые вычисления в таблице, чтобы оптимизировать их и упростить весь процесс работы с данными.
Вариант 2: График функции y=sin(x)
Функций очень много и разобрать их в рамках этой статьи просто невозможно, поэтому в качестве альтернативы предыдущему варианту предлагаем остановиться на еще одном популярном, но сложном — y=sin(x). То есть изначально есть диапазон значений X, затем нужно посчитать синус, чему и будет равняться Y. В этом тоже поможет созданная таблица, из которой потом и построим график функции.
-
Для удобства укажем всю необходимую информацию на листе в Excel. Это будет сама функция sin(x), интервал значений от -1 до 5 и их шаг весом в 0.25.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
График позволяет визуально оценить зависимость данных от определенных показателей или их динамику. Эти объекты используются и в научных или исследовательских работах, и в презентациях. Давайте рассмотрим, как построить график в программе Microsoft Excel.
Создание графиков в Excel
Каждый пользователь, желая более наглядно продемонстрировать какую-то числовую информацию в виде динамики, может создать график. Этот процесс несложен и подразумевает наличие таблицы, которая будет использоваться за базу. По своему усмотрению объект можно видоизменять, чтобы он лучше выглядел и отвечал всем требованиям. Разберем, как создавать различные виды графиков в Эксель.
Построение обычного графика
Рисовать график в Excel можно только после того, как готова таблица с данными, на основе которой он будет строиться.
- Находясь на вкладке «Вставка», выделяем табличную область, где расположены расчетные данные, которые мы желаем видеть в графике. Затем на ленте в блоке инструментов «Диаграммы» кликаем по кнопке «График».
- После этого открывается список, в котором представлено семь видов графиков:
- Обычный;
- С накоплением;
- Нормированный с накоплением;
- С маркерами;
- С маркерами и накоплением;
- Нормированный с маркерами и накоплением;
- Объемный.
Редактирование графика
После построения графика можно выполнить его редактирование для придания объекту более презентабельного вида и облегчения понимания материала, который он отображает.
-
Чтобы подписать график, переходим на вкладку «Макет» мастера работы с диаграммами. Кликаем по кнопке на ленте с наименованием «Название диаграммы». В открывшемся списке указываем, где будет размещаться имя: по центру или над графиком. Второй вариант обычно более уместен, поэтому мы в качестве примера используем «Над диаграммой». В результате появляется название, которое можно заменить или отредактировать на свое усмотрение, просто нажав по нему и введя нужные символы с клавиатуры.
Построение графика со вспомогательной осью
Существуют случаи, когда нужно разместить несколько графиков на одной плоскости. Если они имеют одинаковые меры исчисления, то это делается точно так же, как описано выше. Но что делать, если меры разные?
- Находясь на вкладке «Вставка», как и в прошлый раз, выделяем значения таблицы. Далее жмем на кнопку «График» и выбираем наиболее подходящий вариант.
Построение графика функции
Теперь давайте разберемся, как построить график по заданной функции.
-
Допустим, мы имеем функцию Y=X^2-2 . Шаг будет равен 2. Прежде всего построим таблицу. В левой части заполняем значения X с шагом 2, то есть 2, 4, 6, 8, 10 и т.д. В правой части вбиваем формулу.
Как видим, Microsoft Excel предлагает возможность построения различных типов графиков. Основным условием для этого является создание таблицы с данными. Созданный график можно изменять и корректировать согласно целевому назначению.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Помогла ли вам эта статья?
Еще статьи по данной теме:
Ну у вас примеры не такие, какие меня интересуют. Как быть, когда имеются эмпирические данные, где шаг изменения значения переменной Х в ряду не равный? Например ряд значений Х: 2, 5. 10, 20…которым соответствует свое значение функции Y… Ведь в Экселе по оси Х график отражается при равных по длине делениях и график будет искажен (как бы сжат). Как все же в Экселе построить реальный график?
Здравствуйте! У меня есть таблица движения материальной точки по плоскости. Цифровые данные имеются по осям Х и Y. Допустим кривая движения точки похожа на эллипс. То есть кривая загибается в обратном направлении. При попытке создания этого графика в Эксель обратный загиб не получается.
Вопрос. Можно ли в Эксель получить график траектории движения точки на плоскости?
Задайте вопрос или оставьте свое мнение Отменить комментарий
Самый наглядный способ демонстрации динамики изменения данных в таблице - график. Информация в таком виде воспринимается легче табличной. В данной статье мы на примерах разберём несколько простейших способов построения графиков в Excel. С одним и несколькими рядами данных.
Для создания графика в программе MS Excel на основе таблицы с данными воспользуемся разделом Диаграммы на вкладке Вставка ленты инструментов. Разберём подробно инструменты: График и Точечная. Эти виды диаграмм соответствуют привычным математическим графикам.
Диаграмма типа График
Для построений необходимо выделить столбец, содержащий значения функции, вместе с заголовком и выполнить команду вкладка Вставка — инструмент График. Выбираем вариант График с маркерами как наиболее показательный.
После нажатия на пиктограмму получаем график функции, который необходимо доработать по следующим позициям:
Внесëм необходимые изменения при помощи раздела Работа с диаграммами и двух его вкладок Конструктор и Формат. Он становится доступным при выделенной диаграмме. Также справа от диаграммы появляются три дополнительных инструмента: элементы, стили и фильтры. Они помогают облегчить работу по редактированию графика.
Добавить подписи и легенду можно двумя способами:
- с помощью инструмента Экспресс макеты на вкладке Конструктор;
- воспользоваться инструментом Элементы диаграммы (значок + в правом верхнем углу), расставив необходимые флажки.
Заполняем поля подписей осей. Щелчком правой кнопки мыши (ПКМ) на поле надписи вызываем контекстное меню и выбираем пункт Изменить текст. Вводим данные с клавиатуры или копируем из соответствующих ячеек таблицы.
Изменяем значения горизонтальной оси таким образом, чтобы они соответствовали табличным. На вкладке Конструктор выбираем инструмент Выбрать данные. В диалоговом окне в графе Подписи горизонтальной оси нажимаем кнопку Изменить. Выделяем столбец, содержащий данные аргумента функции, без заголовка и дважды нажимаем на кнопку ОК.
Последним шагом в оформлении графика будет форматирование осей. Шаг необязательный, но после него оси абсцисс и ординат станут заметнее выделяться на сетке. Это сделает график более наглядным.
Левой кнопкой мыши (ЛКМ) выделяем горизонтальную ось и переходим на вкладку Формат. Инструмент Формат выделенного объекта вызывает диалоговое окно форматирования в правой части программы.
В разделе Заливка и границы изменяем параметры для линии: цвет, ширина, тип. Также, если есть необходимость, прорабатываем параметры текста в том же окне.
Добавление линии на график
Добавим к построенному графику ещё одну функцию. Для этого одним щелчком ЛКМ выделяем график и на вкладке Конструктор выбираем инструмент Выбрать данные. В диалоговом окне в графе Элементы легенды нажимаем кнопку Добавить.
Заполняем диалоговое окно Изменение ряда. В поле Имя ряда вносим ячейку, содержащую название функции. В поле Значения — диапазон значений функции. Дважды нажимаем кнопку ОК.
Диаграмма типа Точечная
Для построений необходимо выделить всю таблицу вместе с заголовком и выполнить команду вкладка Вставка — инструмент Точечная. Выбираем вариант Точечная с гладкими кривыми и маркерами как более показательный.
После нажатия на пиктограмму получаем график функций. Самым большим преимуществом точечной диаграммы является автоматическая подпись горизонтальной оси и ось ординат, которая располагается в точке 0. Как и в варианте “график”, данную диаграмму надо доработать:
- добавить подписи осей и названия диаграммы;
- добавить или изменить легенду (название функций);
- оформить оси (по необходимости).
Для этого, также как и в случае с графиком, используются раздел Работа с диаграммами и вкладки Конструктор и Формат. А также дополнительные инструменты справа от диаграммы: элементы, стили и фильтры.
Добавляем подписи и легенду с помощью инструмента Экспресс макеты на вкладке Конструктор или воспользовавшись инструментом Элементы диаграммы (значок + справа от диаграммы), расставив необходимые флажки.
Поля подписей заполняем аналогично предыдущему графику: щелчок ПКМ по полю надписи — Изменить текст или двойной щелчок ЛКМ. Данные заполняем с клавиатуры или путём копирования из соответствующих ячеек.
Последним штрихом придаём графику больше наглядности — форматируем оси. Левой кнопкой мыши выделяем горизонтальную ось и переходим на вкладку Формат. Инструмент Формат выделенного объекта вызывает окно форматирования в правой части программы.
В разделе Заливка и границы изменяем параметры для линии тем же способом как при форматировании графика.
Следующим шагом ограничим ось абсцисс. В разделе Параметры оси изменяем максимальную и минимальную границы на 4,5 и - 4,5 соответственно. Уменьшаем шаг с 1 до 0,5 в разделе Единицы измерения для более наглядного отображения данных.
Последним штрихом в работе с графиком функции может быть изменение заливки области диаграммы. Для этого на вкладке Формат выбираем инструмент Заливка фигуры и устанавливаем необходимый цвет заливки.
В итоге преобразований получаем следующую диаграмму типа точечная.
Спасибо за Вашу оценку. Если хотите, чтобы Ваше имя
стало известно автору, войдите на сайт как пользователь
и нажмите Спасибо еще раз. Ваше имя появится на этой стрнице.
Понравился материал?
Хотите прочитать позже?
Сохраните на своей стене и
поделитесь с друзьями
Вы можете разместить на своём сайте анонс статьи со ссылкой на её полный текст
Ошибка в тексте? Мы очень сожалеем,
что допустили ее. Пожалуйста, выделите ее
и нажмите на клавиатуре CTRL + ENTER.
Читайте также: