Как сделать синусоиду в c

Добавил пользователь Дмитрий К.
Обновлено: 28.08.2024

Начальный курс программирования для студентов направления "Прикладная математика" Одесского национального университета имени И.И.Мечникова

dr.Mazurok

Software developer AI Scientist Ass.prof Odessa National I.I.Mechnikov University

Личные Ссылки

Проверенные Сервисы

Jane Platonova

  • e-olymp 396. Дождь 24/11/2021
  • OCPC2021 K: Нобелевская премия 13/11/2021
  • OCPC2021 J: Театр теней 13/11/2021
  • OCPC2021: I Белка в колесе 13/11/2021
  • OCPC2021 H: Счастья всем даром! 13/11/2021

Напишите программу, которая выводит на экран таблицу значений функции [latex]y = 3\sin\left(x\right) [/latex] на промежутке от [latex]a[/latex] до [latex]b[/latex] включительно с шагом [latex]h[/latex].

В одной строке через пробел заданы три вещественных числа [latex]a[/latex], [latex]b[/latex] и [latex]h[/latex].

В каждой строке выведите по два числа [latex]x[/latex] и [latex]y[/latex] соответственно, по возрастанию [latex]x[/latex] с тремя десятичными знаками.

Подключим модули cmath, чтобы использовать функцию синус, и iomanip, для установления точности ответа. Далее, с помощью цикла от [latex]a[/latex] до [latex]b[/latex] с шагом [latex]h[/latex] выведем на экран таблицу значений функции на заданном промежутке.

Задача

Функция [latex]f(x)[/latex] определена следующим образом:
[latex]f\left(x\right)= \sin x + \sqrt<\log_<4>3x>+ \lceil 3e^x \rceil[/latex] Вычислите значение [latex]f(x)[/latex] для заданного [latex]x[/latex].

Каждая строка содержит действительное значение [latex]x (x >= 1)[/latex].

Выходные данные

Для каждого значения x выведите в отдельной строке [latex]f(x)[/latex] с 6 десятичными знаками.

Тесты

Код программы

Решение задачи

График функции $f\left(x\right) = \sin x + \sqrt<\log_<4>3x>+ \lceil 3e^x \rceil$

Для решения этой задачи я считывал каждое число из потока ввода и передавал значение в функцию, которая возвращало нужное значение, после чего выводил на экран полученное значение с округлением до 6-го знака после запятой. Использовал стандартную библиотеку , для вычисления синуса, корня, логарифма, нахождения экспоненты и округления вверх.

Ссылки


Решение

В данной задаче нам необходимо сделать два цикла, а конкретней — цикл в цикле.

Тесты

[latex]k[/latex] [latex]t[/latex] [latex]S[/latex]
1 1 0.9092
10 15 1.4908
20 30 8.8956
60 100 41.9133

Воспользуемся веб-приложением и посчитаем сумму ряда.

Ссылки

Постановка задачи

Вычислите с точностью [latex]\epsilon[/latex] значение функции [latex]f\left( x \right) = \frac[/latex]. При вычислениях допустимо использовать только арифметические операции.

Алгоритм решения

Разложим [latex]g \left( x \right) = \sin x[/latex] по формуле Тейлора с опорной точкой [latex]x_0 = 0[/latex] и остаточным членом в форме Лагранжа:
[latex]g \left( x \right) = P_n \left( x_0 ; x \right) + R_n \left( x_0 ; x \right)[/latex],
[latex]P_n \left( x_0 ; x \right) = g \left( x_0 \right) + \sum_^ \frac \left( x_0 \right) > \left( x — x_0 \right) ^k[/latex],
[latex]R_n \left( x_0 ; x \right) = \frac \left( \xi \right)><\left( n + 1 \right) !>\left( x — x_0 \right) ^ , x_0 1. \end[/latex]

Тесты

Реализация

Задача. Вычислите с точностью [latex]\epsilon[/latex] значение функции [latex]f\left( x \right) = \sin x[/latex]. При вычислениях допустимо использовать только арифметические операции.

Код программы

Тесты

Решение

Необходимо использовать формулу Тейлора, а именно ряд Маклорена, чтобы представить функцию

[latex]f(x)[/latex] = [latex]\sin x[/latex]

Эта формула имеет такой вид [latex]\sin x[/latex] = [latex]\sum _ < n=0 >^< \infty >< < (-1) >^ < n >> \frac < < x >^ < 2n+1 >>< (2n+1)! >[/latex].

Подключаем заголовочный файл cmath для использования функции abs(). Построим реккурентную формулу для [latex]x_n[/latex] через [latex]x_[/latex] для [latex]n > 1 \left(x_0=x\right)[/latex]. Для этого найдем отношение последующего члена ряда к предыдущему [latex]k = \frac = -\frac<2n\cdot(2n + 1)>[/latex].

Используем функцию while, чтобы проверить является ли член ряда [latex]x_n[/latex] больше [latex]e[/latex].

Постановка задачи

Дано действительное число [latex]a[/latex]. Вычислить [latex]f(a)[/latex], если
[latex]f(x) = \begin0, & x \le 0;\\x^2 — x, & 0 1 \end[/latex]

Алгоритм решения

Находим промежуток, которому принадлежит [latex]a[/latex]. Если [latex]a \in (-\infty;0][/latex], то [latex]f(a) = 0[/latex], если [latex]a \in (0;1][/latex], то [latex]f(a) = a^2 — a[/latex], в остальных случаях [latex]f(a) = a^2 — \sin(\pi \cdot a ^ 2)[/latex].

Тесты

Реализация

Данная задача находится здесь.

Условие:

Определить периметр правильного [latex] m [/latex]-угольника, вписанного в окружность радиуса [latex] R [/latex].

Количество сторон правильного многоугольника [latex] m [/latex] и радиус [latex] R [/latex] описанной около него окружности.

Выходные данные:

Единственное число — периметр заданного многоугольника.

Тесты:

m R P
1 3 4 20.7846
2 6 5 30
3 8 13 79.5982
4 27 20 125.38

Код программы:

Убедиться в корректности формулы с помощью онлайн-калькулятора можно на этом сайте.

Решение:

Для решения данной задачи воспользуемся формулой для нахождения длины стороны правильного многоугольника с помощью радиуса описанной окружности: [latex]a=2\cdot R\cdot\sin<\frac<\pi>>[/latex] , где [latex]R[/latex] — радиус описанной окружности, а [latex]m[/latex] — количество сторон правильного многоугольника. В задаче необходимо найти периметр, т.е. общую длину всех сторон: [latex]P=a\cdot m[/latex] . Таким образом, объединив формулы, получаем конечную формулу для нахождения периметра правильного многоугольника: [latex]P=\left(2\cdot R\cdot\sin<\frac<\pi>>\right)\cdot m[/latex] , значение которой и необходимо вывести.

Задача

Численно убедится в справедливости равенства для заданного значения аргумента [latex]x[/latex] на заданное значение погрешности [latex]\varepsilon[/latex]. Вывести число итераций.

Тест

[latex]x[/latex] Delta Результат(wolframalpha)
0 0 0.001 0
3.14 [latex]\pi[/latex] 0.0001 0.00161324
1.57 [latex]\pi/2[/latex] 0.00001 1
1.05 [latex]\pi/3[/latex] 0.0001 0.86602
2.06 [latex]2\pi/3[/latex] 0.0001 0.869296

Переменной [latex]sum[/latex] присваиваем значение [latex]0[/latex]. Вводим элемент [latex]a[/latex], который мы будем суммировать в цикле до [latex]n[/latex]:

Далее вводим в input соответствующие значения [latex]a[/latex] и получаем ответ.

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

Работу программы можно посмотреть тут.

Задача: В задаче задана функция и её разложение в ряд или произведение. Численно убедится в справедливости равенства, для чего для заданного значения аргумента [latex] x [/latex] вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью [latex]\varepsilon\[/latex]. Испытать разложение на сходимость при разных значениях аргумента, оценить скорость сходимости, для чего вывести число итераций [latex] n [/latex] (слагаемых или сомножателей), необходимых для достижения заданной точности.
[latex]\sin \left(x \right) = x \left(1 — \frac><\pi^> \right) \left( 1 — \frac><4\pi^> \right) \ldots \left(1 — \frac>< \left( n-1 \right)^\pi^> \right)[/latex]

Функции sin возвращают синус x. Если значение x больше или равно 263 или меньше или равно-263, то происходит отрицательное значение в результате.

Ввод Исключение SEH Исключение Matherr
± КНАН, С Нет _DOMAIN
± ? (SIN, sinf, sinl) INVALID _DOMAIN

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno, _sys_errlist и _sys_nerr.

Комментарии

Поскольку C++ допускает перегрузку, можно вызывать перегрузки sin , которые принимают и возвращают long double значения или. В программе на языке C, если только вы не используете для вызова этой функции, функция double .

При использовании sin() тип аргумента определяет, какая версия функции выбрана. Подробные сведения см. в разделе Type-Generic Math .

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

Пишу сирену на с++ Столкнулся с тем, что на отрезке от верхней частоты к нижней, синусоида замедляется до нулевой частоты, а затем частота вновь растет до некоторого значения! С чем это может быть связано, и как это побороть?

Я не вижу здесь на осциллограмме нулевой частоты. Уменьшилась до минимальной и затем в точке, близкой к минимуму, начала зеркально увеличиваться (если спроецировать на механику, то колесо в нижней точке замерло на миг и начало повораитваться в обратную сторону).


Микропроцессоры Xmega имеют несколько таймер-счетчиков с расширенными возможностями, которые могут быть использованы, например, для управления двигателями или для контроля за питанием. Данная статья посвящена данным возможностям и в частотности формированию синусоиды и формировании из нее ШИМ сигнала с вставкой интервалов мертвого времени для управления ключами инвертора, который может использоваться, например, для управления электродвигателями.


Вставка мертвого времени
Во многих применениях, таких, как управление электродвигателями, используется генерация ШИМ сигнала по полумостовой схеме, аналогичной показанной на следующем рисунке:


Если высокая сторона переключается по ШИМ сигналу PWMH, а нижняя по инверсному ШИМ сигналу PWML, то выходное напряжение VOUT будет пропорционально скважности ШИМ сигнала PWMH.
Показанная полумостовая схема обычно реализуется на ключах MOSFET или IGBT. Так как эти устройства не могут включиться или отключиться мгновенно, в силу того, что существует небольшое время нарастания/спадания выходного сигнала. Если сигнал, подаваемый на низкую сторону, является инверсией сигнала подаваемого на высокую сторону, то всегда существует короткий интервал времени, когда обе стороны включены, что приведет к короткому замыканию между питанием и землей в течение этого периода. Такие замыкания называют сквозными и являются не допустимыми.
Обычно данную проблему решают вставкой небольшого промежутка мертвого времени до и после момента переключения. Таким образом, при отключении низкой стороны высокая сторона не включается до тех пор, пока не закончится интервал мертвого времени. Это и называется вставкой мертвого времени.
Интервалы протяженности мертвого времени для высокой и низкой стороны могут быть установлены индивидуально в регистрах DTHS и DTLS соответственно. Для простоты регистры DTHS и DTLS могут быть установлены в одинаковое значение записью регистра DTBOTH. Значение мертвого времени задается в тактах основных системных часов. Допустимые значения мертвого времени находятся в диапазоне от 0 до 255 тактов основных системных часов.
Применения функции вставки мертвого времени DTI перекрывает обычную работу портов ввода-вывода и имеет более высокий приоритет, чем модуль таймера-счетчика. Можно включить функцию DTI для каждого канала независимо.
Только парные ножки, настроенные на выход, могут быть использованы для вставки мертвого времени модулем AWeX. Карта расположения ножек для вставки мертвого времени показана в следующей таблице:


Образцовый генератор
Образцовый генератор использует регистры DTI и двойной буферный механизм для синхронизации битового образца на порту, к которому он подключен. Компаратор канала А таймера-счетчика 0 соединенный с тем же портом ввода-вывода может быть распределен или перекрывать все ножки порта. Это позволяет сложным образцам ШИМ быть сгенерированными на потру ввода-вывода.
Образцовый генератор может быть использован для: формирования переключающей последовательности для безколлекторных двигателей постоянного тока и шаговых двигателей, управления группами светодиодов или для других применений, где необходимо выборочно распределять один ШИМ сигнал в несколько мест назначения.
Функционирование образцового генератора показано на следующем рисунке:



Ширина импульса разделена на две части: грубое время tCOARSE и уточненное время tFINE, сумма которых равна времени импульса tP. Таймер-счетчик генерирует грубую часть импульса, в то время как функция HiRes растягивает его на промежуток до 3 тактов.
Это достигается делением процесса формирования ШИМ сигнала на две части. Таймер-счетчик используется для генерации ШИМ сигнала из 14 старших битов для канала сравнения таймер счетчика. Этот грубый сигнал подается на модуль HiRes, который отвечает за добавление улучшенной части импульса состоящего из двух младших битов.
Работа расширения HiRes контролируется двумя битами HREN0 и HREN1 в регистре HIRESx.CTRL разрешающие работу HiRes таймер-счетчиков 0 и 1 соответственно.
Для корректной работы модуля HiRes необходимо настроить входные часы на частоту в 4 раза большую, чем основные системные часы. На следующем рисунке представлена упрощенная схема формирования часов:


Читайте также: