hudrogen
@hudrogen

Как аппроксимировать синусоиду по трем параметрам?

Здравствуйте! Имеется набор X от 0 до n с определенным шагом 360/n и набор Y, соответствующие этим X

Y = a + b*sin(X + c) . Перед Х коэффицтента нет, т.к. известно что период всегда равен 2пи.ъ

Если можно подскажите подробный алгоритм аппроксимации МНК с использованием какого-нибудь ЯП.

Разбор этого же вопроса на другом ресурсе:
www.cyberforum.ru/algorithms/thread1553818.html
  • Вопрос задан
  • 2949 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Если X идёт с равномерным шагом, то МНК не нужен.
Сначала сводите задачу к Y=a+d*sin(X)+f*cos(X).
Довольно очевидно, что a=sum(Y)/n (поскольку sum(sin(X))=sum(cos(X))=0).
Далее, умножаете обе части исходной формулы на sin(X):
sum(Y*sin(x))=a*sum(sin(X))+d*sum(sin(X)^2)+f*sum(sin(X)*cos(X))
Выполняются условия sum(sin(X))=sum(sin(X)*cos(X))=0, sum(sin(X)^2)=n/2 (если n > 2). Отсюда d=sum(Y*sin(X))*2/n. Аналогично, f=sum(Y*cos(X))*2/n.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sivabur
@sivabur
Заблокировали просто так!
@borodaturan
Python developer
Для таких вещей очень удобен python со своими математическими библиотеками numpy и scipy.

Вот код, который решает Вашу задачу поиска неизвестных коэффициентов:
import numpy as np
from scipy.optimize import curve_fit

test_a = 1.7
test_b = -5.689
test_c = 1.2456


def test_sin(x, a, b, c):
    return a + b * np.sin(x + c)

if __name__ == '__main__':
    x = np.array(range(10))   
    y = test_sin(x, test_a, test_b, test_c)

    params, cov = curve_fit(test_sin, x, y)
    print(params)

Ссылка на описание функции curve_fit.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы