Вопрос или проблема
Я пытаюсь подогнать вращающуюся параболу с помощью 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 для более гибкой настройки ваших функций подгонки. Эти библиотеки могут предложить дополнительные инструменты для работы с решением нестандартных задач подгонки кривых.
Заключение
При попытке решить задачи подгонки вращенных кривых убедитесь, что функции корректно обрабатывают изменения координат и возвращают данные в нужном для подгонки формате. Корректная настройка ваших функций и использование более мощных библиотек существенно повысят качество подгонки.