Подгонка повёрнутой кривой

Вопрос или проблема

Я пытаюсь подогнать вращающуюся параболу с помощью curve_fit, но она не подходит хорошо, как показано ниже:

Вращающаяся парабола и подогнанная линия с помощью curve_fit

Я уже пытаюсь подогнать кривую с учетом зависимости от cos(𝜃) и sin(𝜃) следующим образом:

def rotated_parabola(x, a, b, c, theta):
    # Оригинальная парабола
    y = a * x**2 + b * x + c

    # Вращаем параболу
    x_trans = x * np.cos(theta) - y * np.sin(theta)
    y_trans = x * np.sin(theta) + y * np.cos(theta)
    return x_trans, y_trans

Буду признателен за какие-либо идеи о том, почему это не подходит хорошо, или если существуют какие-либо существующие библиотеки, которые могут решить эту задачу, тоже будет здорово!

Заранее спасибо.

Ответ или решение

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

Проблема с текущим кодом

Ваш код определяет функцию rotated_parabola, которая принимает параметры a, b, c и theta. Однако вы не возвращаете значение y, что может привести к нежелательным результатам. Кроме того, ваши уравнения для вращения параболы могут быть неправильно интерпретированы, так как они должны отражать как преобразование координат, так и соответствующее смещение по оси Y.

Уточнение функции

Функция для вращенной параболы может быть корректирована следующим образом:

import numpy as np

def rotated_parabola(theta, a, b, c, x):
    # Исходная парабола
    y = a * x**2 + b * x + c

    # Применение вращения к координатам
    x_rot = x * np.cos(theta) - y * np.sin(theta)
    y_rot = x * np.sin(theta) + y * np.cos(theta)

    return x_rot, y_rot

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

Задача curve_fit

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

from scipy.optimize import curve_fit

def fit_function(x, a, b, c, theta):
    x_rot, y_rot = rotated_parabola(theta, a, b, c, x)
    return y_rot

# Пример использования curve_fit
x_data = np.array(...) # ваши данные x
y_data = np.array(...) # ваши данные y

# Начальные значения для параметров
initial_guess = [1, 1, 1, 0]  # a, b, c, theta 

# Выполняем подгонку
params, covariance = curve_fit(fit_function, x_data, y_data, p0=initial_guess)

Обсуждение результатов

После выполнения подгонки, результаты параметров, возвращенные curve_fit, будут представлять собой а, b, c и угол theta в радианах. Убедитесь, что данные правильно подготовлены, а начальные значения приближения заданы разумно.

Альтернативные библиотеки

Если curve_fit не дает ожидаемых результатов, рассмотрите возможность использования таких библиотек, как lmfit или PyTorch для более гибкой настройки ваших функций подгонки. Эти библиотеки могут предложить дополнительные инструменты для работы с решением нестандартных задач подгонки кривых.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...