""

Метеостанция + построение графика + c#

Метеостанция + построение графика + c#

БлогNot. Visual C++: построение графиков с интерпретацией введённой пользователем функции

Visual C++: построение графиков с интерпретацией введённой пользователем функции

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

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

Текстовым полям можно ограничить максимальный размер вводимой строки (свойство MaxLength ). Также panel1 расположена со свойством Dock=Top , а chart1 со свойством Dock=Fill . Это обеспечит нормальное взаимодействие компонент при изменении размеров окна. У самой формы выставлены Size и MinimumSize в значение 640; 400 – чтобы не “исчезали” кнопки при уменьшении окна.

Текстовым полям также даны значения по умолчанию, дробные части вещественных чисел при этом отделены точкой, а не запятой – будем так делать во всём проекте.

Как альтернатива, можно формировать вещественные значения полей динамически в зависимости от текущего разделителя (например, по событию Load формы 1):

В форму также добавлено глобальное свойство типа NumberFormatInfo

которое проинициализировано в её конструкторе:

Основная работа выполняется по нажатию на кнопку OK ( button1_Click ). Сначала проверяем допустимость введённых данных с помощью пары служебных методов Parse (получить число) и Check (проверить правильность записи функции, попробовав получить её значение от 1-го аргумента). Потом метод Go делает цикл по нужным значениям аргумента, формируя диаграмму. Если возникает ошибка парсера, о ней выводится сообщение, но программа не завершается. Просто в данных не будет какой-то пары значений.

Парсер тот же, что по ссылке выше. Вот полный код фрагмента:

Единственная новая по отношению к статье мелочь –

Если национальные стандарты предполагают, что дробная часть вещественного числа отделяется от целой запятой, а не точкой, вместо оператора

Добавим в проект вторую форму, куда можно будет выводить таблицы данных из диаграммы. Для этого обратимся к меню Проект – Добавить новый элемент – Форма Windows Forms и назовём её Form2 . На вторую форму добавим DataGridView , поставим ему свойства Dock=Fill , ScrollBars=Vertical и подготовим 2 столбца для вывода значений X и Y:

У этой формы будет единственный публичный метод – принять пару значений (x,y) и добавить их в таблицу:

Такой код метода Do работает при установке свойства

так как при значении true в таблице есть “дополнительная” пустая строка, которая тоже участвует в нумерации.

А вызывать этот метод будет вторая кнопка tab с первой формы (функция button2_Click ), при этом, сначала создастся новый экземпляр Form2 , чтобы можно было сравнить несколько таблиц:

Чтобы это сработало, заинклудьте заголовки второй формы в начале кода Form1.h :

Разумеется, сам парсер тоже подлючён. Это весь проект, можно собирать. Вот пример работы программы:

Выражения в парсере пишутся “не совсем на C++”, загляните в файл parser.cpp и увидите это, ещё лучше, можете модифицировать код парсера под свои нужды. Ну и ещё много что можно улучшить, а я выложу проект в текущем “образовательном” состоянии.

Скачать этот проект Visual C++ в архиве .zip (21 Кб)

P.S. Для совместимости с Visual Studio 2015 достаточно сделать вот такой главный файл проекта Lab4.cpp :

Самые очевидные улучшения:

  • округлять вводимые и вычисляемые значения до некого удобного количества знаков в дробной части;
  • ограничить максимальное количество узлов сетки, например, некой константой maxCollectionSize . При “слишком большом” размере коллекции Dictionary приложение может зависнуть, а какой размер “слишком большой”, знает только Studio;
  • найти минимальное и максимальное значения функции, назначив их затем меткам оси Y, выполнить ту же работу и для оси X;
  • следить, не получилось ли при расчёте “не-число” Y с помощью isnan(y) || isinf(y) ;
  • следить, не добавляются ли повторно в коллекцию элементы с тем же ключом, с помощью ContainsKey и т.д.

Вот набросок чуть “улучшенного” проекта для Studio 2015:

Скачать архив .zip с папкой этого проекта Visual Studio 2015 (21 Кб)

P.P.S. Решение едва ли предназначено для консольных приложений из-за не слишком удобных преобразований между строками библиотеки .NET и “классическими” строками std::string или char * . Тем не менее, поизвращаться, конечно, можно, скажем, вот такой код главного модуля проекта годится для консольного приложения Visual Studio 2015:

Читайте также:  Стабилизатор тока для светодиодов своими руками

Как видно из примера, нам пришлось дополнительно написать собственную функцию str_replace для замены строки char * на другую строку, чтобы обеспечить циклическую подстановку значений x в табулируемую функцию f(x) .

А вот архив с этим проектом Visual Studio 2015, с точностью до платформы (выбирается вверху из списков “Конфигурации решения”, “Платформы решения”) должно работать везде 🙂 Конечно же, выражение для нужной функции от аргумента “x” малое и нужные пределы изменения аргумента вы можете не только задать константами, но и прочитать откуда-то (с той же консоли или из файла).

Скачать архив .zip с консольной версией проекта построения графика произвольной функции, Visual Studio 2015 (6 Кб)

14.03.2015, 12:47; рейтинг: 30091

umath.ru

Изучаем математику вместе!

Построение графика функции онлайн

  • Обязательно писать все знаки умножения
  • Десятичные дроби нужно разделять точкой
  • Список функций и констант смотрите ниже

URL-адрес:
html-код ссылки:

Как пользоваться программой:

  • Можно строить графики сразу нескольких функций. Для этого просто разделяйте функции точкой с запятой (;).
  • Масштаб изменяется с помощью кнопок «+» и «−». Кнопка «100%» меняет масштаб на стандартный.
  • Положение экрана можно менять, перетаскивая его мышью, а можно стрелками на панели слева.
  • Кнопка «·» в центре джойстика переносит начало координат в центр экрана.
  • Кнопка «↺» изменяет масштаб на стандартный и переносит начало координат в центр.
  • В форме под графиком можно выбрать точку, которую нужно расположить в центре экрана.

Режимы

Обычный. В этом режиме можно строить графики функций, заданных уравнением

Параметрический. Этот режим предназначен для построения графиков кривых, заданных параметрически, то есть в виде

Полярные координаты. Здесь можно построить график кривой, заданной в полярной системе координат, то есть уравнением где — радиальная координата, а — полярная координата.

Список констант

КонстантаОписание
piЧисло =3,14159.
eЧисло Эйлера =2,71828.

Список функций

ФункцияОписание
+ − * /Сложение, вычитание, умножение, деление
( )Группирующие скобки
abs() или | |Модуль числа. Выражение abs(x) эквивалентно |x| . Если функция содержит модуль под модулем, то пользуйтесь abs() . Например, если вы хотите построить график функции |1-x+|x+5|| , то нужно вводить abs(1-x+abs(x+5)) .
pow() или ^Степень числа. Например, выражения pow(x, 3) и x^3 дают x в третьей степени
sqrt()Квадратный корень
sin()Синус
cos()Косинус
tg()Тангенс
ctg()Котангенс
arcsin()Арксинус
arccos()Арккосинус
arctg()Арктангенс
arcctg()Арккотангенс
ln()Натуральный логарифм числа
lg()Десятичный логарифм числа
log(a, b)Логарифм числа b по основанию a
exp()Степень числа e
sh()Гиперболический синус
ch()Гиперболический косинус
th()Гиперболический тангенс
cth()Гиперболический котангенс

График функции

Графиком функции называется множество точек плоскости таких, что абсциссы и ординаты этих точек удовлетворяют уравнению .

Программа создана для школьников и студентов и позволяет строить графики функций онлайн. Во многих браузерах (например, Google Chrome) картинку с графиком функции можно сохранить на компьютер.

Пожалуйста, все предложения и замечания по работе программы пишите в комментариях.

Кроме того мы планируем создать библиотеку функций с интересными и забавными графиками. Если вы открыли функцию с таким графиком, то обязательно напишите об этом в комментариях! Ваше открытие будет опубликовано и станет носить ваше имя ;).

Построение графика функции онлайн : 42 комментария

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

Не получается построить функцию y=K/x (гипербола)

  1. Андрей Автор записи 26.04.2017 в 22:18

Валерий, а что вы вводите?

Отправил комментарий, он появился на странице, над ним заголовок: Построение графика функции онлайн: комментариев.

Привет! Дело в том, что пока комментарии появляются только после проверки. Пользователь, который написал комментарий, видит его на странице, а все остальные — нет.

Добавлена возможность строить графики в полярных координатах. Просто выберите режим «Полярные координаты» и задайте функцию (здесь — угол).

Не получается построить график функции y=x^-4.Ничего не выдаёт.

  1. Андрей Автор записи 27.01.2016 в 15:15

Алина, здесь нужно поставить скобки: y = x^(-4) . Так всё должно работать

Было бы прекрасно добавить возможность построения кусочно-заданной функции, т.е. например f(x)==0; -x, x

  1. Андрей Автор записи 30.05.2016 в 20:14

Павел, спасибо за предложение! Я планирую доработать программу в ближайшее время, и обязательно учту Ваш комментарий

Так и не появилось кусочно-заданных функций?

Очень полезно, спасибо!
Предложения по доработке:
1. Возможность построения графика неявно заданной функции.
2. Что бы при наведении на кривую графика фигуры курсор «прикреплялся» к точке, которая принадлежит кривой. Так же, как окна в Windows 7 при перетаскивании к границам экрана «прилипают» к этим границам. Так можно будет наверняка узнать, что я вижу вверху слева координаты именно нужной кривой, а не точки, что очень рядом.

Читайте также:  Простой торговый автомат своими руками

r(t)=cos(1.52t) — очень красивая штука.

При построении y=x^(1/3) не уходит в отрицательную область(3 четверть), а должен уходить!

Неправильно строит функцию арккотангенса, т.е. arcctg(x). Вместо нее он строит arctg(1/x). У этих функций на положительных значениях аргумента графики совпадают, а на отрицательных различаются на «пи»

  1. Андрей Автор записи 29.11.2016 в 00:12

Инна, огромное спасибо за комментарий! Действительно, график арккотангенса строился неправильно. Исправил

Программа прекрасная. Очень хотелось бы наносить свои надписи. Например, вместо Y написать — деньги, вместо X — срок жизни. Как скопировать график в Word?
Где можно указать диапазон изменения X и Y?

  1. Андрей Автор записи 20.12.2016 в 21:29

Спасибо! Наносить свои подписи сейчас нельзя. Чтобы вставить график в Word, сохраните график как картинку (клик по графику правой кнопкой мыши, далее «Сохранить картинку как») и вставьте её.
Указать диапазон для x тоже пока нельзя, но можно написать, например, вот так: y(x) = sin(x) * (x > 1) * (x . Здесь функция sin(x) строится для x от 1 до 4, все остальные значения равны 0.

Писал сам такую программу в 1999 году в школе на паскале, с такими же возможностями, кусочно-заданная также была включена.
Советую добавить отдельное масштабирование по осям X и Y, а также историю вводимых функций.

  1. Андрей Автор записи 14.02.2017 в 01:35

Максим, спасибо за отзыв! Новая версия как раз в разработке

дайте цвет, зависящий от параметра

  1. Андрей Автор записи 02.03.2017 в 22:44

qqq, спасибо за комментарий, отличная идея! Как раз пишу новую версию

В обычном режиме невозможно строить графики вида x=const (х=1, х=20, х=pi/3)
В режиме полярной оси координат не нужны и только лишь путают оси X и Y (откуда они там вообще?)
Соответственно и шкала значений по этим осям измеряет непонятно что. Координата точки в полярной системе координат это пара вида радиус, угол (r, t) — т.е. в текущей версии r конкретной точки равен sqrt (x^2 + y^2)
Полярная система координат должна выглядеть вот так: https://upload.cc/i/CnTf7G.jpg
_
Не дочерчивает график: https://upload.cc/i3/vbpI6m.png
Функция y=cos(x) четная, следовательно, y(-x)=y(x), поэтому значение функции r(t)=6cos(3t), при t=-pi/9 и t=pi/9 равно 3. На картинке видно что при t=pi/9 функция не r=3
Хотелось бы иметь возможность строить в одной плоскости графики функций как заданных в виде y=f(x), так и заданных параметрически, а так же выставлять свой масштаб.
В остальном все очень удобно, спасибо.

Неправильно строит графики уравнений вида r=cos(a*t), где а — чётное число(в полярной системе координат).

Добрый день.
Сделайте, пожалуйста, возможность менять масштаб отдельно по X и по Y.
Спасибо.

не строит функцию
y=|(|x|-2)^2-3|

  1. Андрей Автор записи 10.11.2017 в 01:52

Используйте функцию abs(), это поможет программе правильно прочитать выражение:
y = |(abs(x)-2)^2-3|

Не могу построить график с ограниченным параметром, y = x^2, x

Подскажите, как правильно описать у вас такой график: |y-1|=4-|x-1| ?

График y=|lg(x)| рисует при отрицательных x.

Можно ли построить график кубического корня? А корня шестой степени? Если да, то как?

  1. Андрей Автор записи 13.10.2018 в 15:38

Да, можно, вот так: x^(1/3); x^(1/6)

А можно выбирать цвет графиков?
Если нет, то когда

Попробуйте это: x!^x!

Укажите в инструкциях, что здесь МОЖНО построить (y=x!)
Кстати, сделайте так, чтобы можно было включать/выключать потребность залесть в комплексные числа, то есть, к примеру, при построении (y=sqrt(x)^2) можно как и рисовать график при x

классная программа , только лагает

sqrt(3x+3) — почему начало с -1?? объясните пж(

А как построить системы уравнений?

x = t — 0.8 * sin(t * (1.1) ^ t * 20) * cos(t) / sqrt(1 + cos(t) * cos(t)) / (1.3) ^ t
y = sin(t) / (1.1) ^ t + 0.8 * sin(t * (1.1) ^ t * 20) / sqrt(1 + cos(t) * cos(t)) / (1.3) ^ t
t [0, 50]
Затухающая синусоида поверх затухаущей синусоиды, выглядит красиво)

Matplotlib. Урок 4.1. Визуализация данных. Линейный график

Линейный график – это один из наиболее часто используемых видов графика для визуализации данных. Он использовался нами для демонстрации возможностей Matplotlib в предыдущих уроках, в этом уроке мы более подробно рассмотрим возможности настройки его внешнего вида.

Построение графика

Для построения линейного графика используется функция plot() , со следующей сигнатурой:

plot([x], y, [fmt], *, data=None, **kwargs)

plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)

Если вызвать функцию plot() с одним аргументом – вот так: plot(y) , то мы получим график, у которого по оси ординат (ось y ) будут отложены значения из переданного списка, по по оси абсцисс (ось x ) – индексы элементов массива.

Рассмотрим аргументы функции plot() :

  • x, x2, …: array
    • Набор данных для оси абсцисс первого, второго и т.д. графика.
  • y, y2, …: array
    • Набор данных для оси ординат первого, второго и т.д. графика.
  • fmt: str
    • Формат графика, задается в виде строки: ‘[marker][line][color]’ .
  • **kwargs – свойства класса Line2D , которые предоставляют доступ к большому количеству настроек внешнего вида графика, отметим наиболее полезные:
Читайте также:  Как рассчитать мощность трансформаторной подстанции?
СвойствоТипОписание
alphafloatПрозрачность
color или ccolorЦвет
fillstyleСтиль заливки
labelobjectТекстовая метка
linestyle или lsСтиль линии
linewidth или lwfloatТолщина линии
markermatplotlib.markersСтиль маркера
markeredgecolor или meccolorЦвет границы маркера
markeredgewidth или mewfloatТолщина границы маркера
markerfacecolor или mfccolorЦвет заливки маркера
markersize или msfloatРазмер маркера

Параметры аргумента fmt

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

СимволОписание
‘.’Точка ( point marker )
‘,’Пиксель ( pixel marker )
‘o’Окружность ( circle marker )
‘v’Треугольник, направленный вниз ( triangle_down marker )
‘^’Треугольник, направленный вверх( triangle_up marker )
Треугольник, направленный влево ( triangle_left marker )
‘>’Треугольник, направленный вправо ( triangle_right marker )
‘1’Треугольник, направленный вниз ( tri_down marker )
‘2’Треугольник, направленный вверх( tri_up marker )
‘3’Треугольник, направленный влево ( tri_left marker )
‘4’Треугольник, направленный вправо ( tri_right marker )
‘s’Квадрат ( square marker )
‘p’Пятиугольник ( pentagon marker )
‘*’Звезда ( star marker )
‘h’Шестиугольник ( hexagon1 marker )
‘H’Шестиугольник ( hexagon2 marker )
‘+’Плюс ( plus marker )
‘x’Х-образный маркер ( x marker )
‘D’Ромб ( diamond marker )
‘d’Ромб ( thin_diamond marker )
‘|’Вертикальная линия ( vline marker )
‘_’Горизонтальная линия ( hline marker )

Стиль линии/ Может принимать одно из следующих значений:

СимволОписание
‘-‘Сплошная линия ( solid line style )
‘–‘Штриховая линия ( dashed line style )
‘-.’Штрих-пунктирная линия ( dash-dot line style )
‘:’Штриховая линия ( dotted line style )

Цвет графика. В рамках аргумента fmt цвет задается значением из следующей таблицы:

СимволОписание
‘b’Синий
‘g’Зеленый
‘r’Красный
‘c’Бирюзовый
‘m’Фиолетовый (пурпурный)
‘y’Желтый
‘k’Черный
‘w’Белый

Реализуем возможности plot() на примере:

Рассмотрим различные варианты использования линейного графика.

Заливка области между графиком и осью

Для заливки областей используется функция fill_between() . Сигнатура функции:

fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)

Основные параметры функции:

  • x : массив длины N
    • Набор данных для оси абсцисс.
  • y1 : массив длины N или скалярное значение
    • Набор данных для оси ординат – первая кривая.
  • y2 : массив длины N или скалярное значение
    • Набор данных для оси ординат – вторая кривая.
  • where: массив bool элементов (длины N), optional, значение по умолчанию: None
    • Задает заливаемый цветом регион, который определяется координатами x[where] : интервал будет залит между x[i] и x[i+1] , если where[i] и where[i+1] равны True .
  • step : <‘pre’, ‘post’, ‘mid’>, optional
    • Определяет шаг, если используется step -функция для отображения графика (будет рассмотрена в одном из следующих уроков).
  • **kwargs
    • Свойства класса Polygon

Создадим набор данных для эксперимента:

Отобразим график с заливкой:

Изменим правила заливки:

Используя параметры y1 и y2 можно формировать более сложные решения.

Заливка области между 0 и y , при условии, что y >= 0:

Заливка области между 0.5 и y , при условии, что y >= 0.5:

Заливка область между y и 1:

Вариант двухцветной заливки:

Настройка маркировки графиков

В начале этого раздела мы приводили пример использования маркеров при отображении графиков. Сделаем это ещё раз, но уже в упрощенном виде:

В наборе данных, который создает код:

количество точек составляет 500, поэтому подход, представленный выше уже будет не применим:

В этой случае нужно задать интервал отображения маркеров, для этого используется параметр markevery , который может принимать одно из следующих значений:

None – отображаться будет каждая точка;

N – отображаться будет каждая N -я точка;

(start, N) – отображается каждая N -я точка начиная с точки start ;

slice(start, end, N) – отображается каждая N -я точка в интервале от start до end ;

[i, j, m, n] – будут отображены только точки i, j, m, n .

Ниже представлен пример, демонстрирующий работу с markevery :

Обрезка графика

Для того, чтобы отобразить только часть графика, которая отвечает определенному условию используйте предварительное маскирование данных с помощью функции masked_where из пакета numpy .

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.

Рейтинг
( Пока оценок нет )
Загрузка ...
×
×
Adblock
detector