1 votos

¿Cuál es una buena técnica para encontrar una fórmula sencilla que se ajuste a una serie de tres puntos?

Tengo tres puntos:

  • 0: 595
  • 90: 1480
  • 180: 2440

(El primer valor es un ángulo en grados, el segundo es el ancho de pulso en milisegundos que produce ese ángulo en un servomotor concreto).

Como puedes ver, la línea descrita por estos puntos no es del todo lineal. (Aunque supongo que los puntos intermedios estarán más o menos sobre la recta).

Lo que me gustaría es encontrar una fórmula que se ajuste a la línea y me dé el ancho de pulso para un ángulo deseado. ¿Cuál es una buena estrategia para hacerlo? Creo que podría llegar a algo como

pw = ((angle * <a multiplier>) + (angle * <a coefficient>)) + 595

por burda prueba y error, pero estoy seguro de que debe haber una forma más elegante.

1voto

CodeMonkey1313 Puntos 4754

Si crees que tus tres puntos son (en esencia) exactamente correctos, puedes unirlos mediante una línea discontinua. Ésa es la interpolación lineal en el comentario de @PeterForeman . Si son medidas aproximadas utiliza regresión lineal para encontrar la línea recta que mejor se ajusta a los tres, en promedio.

Me sorprendería que Python no tuviera paquetes para ambos.

1voto

Según mi calculadora la ecuación de regresión lineal es $$y=582.5+10.25x$$

Dónde $x$ es el ángulo en grados y $y$ es la anchura del impulso

Una ecuación de regresión cuadrática es $$y=0.004629x^2+9.4166x+595$$

1voto

Daniele Procida Puntos 113

Para completar las otras respuestas, descubrí dos formas de hacerlo (implementadas en Python).

Puedo crear dos listas:

angles = [-90, 0, 90]
pulse_widths = [595, 1480, 2440]

numpy.polyfit

A continuación, utilizando numpy.polyfit Sí que puedo:

>>> import numpy
>>> numpy.polyfit(angles, pulse_widths, 2)
array([4.62962963e-03, 9.41666667e+00, 5.95000000e+02])

Y los valores que devuelve se pueden utilizar para construir la ecuación que necesito:

pulse_width = 4.62962963e-03 * angle ** 2 + 9.41666667 * angle + 595

Polinomio de Lagrange

O puedo utilizar un Polinomio de Lagrange .

pw = (pulse_widths[0] * (angle - angles[1]) * (angle - angles[2])) / ((angles[0] - angles[1]) * (angles[0] - angles[2])) + \
    (pulse_widths[1] * (angle - angles[0]) * (angle - angles[2])) / ((angles[1] - angles[0]) * (angles[1] - angles[2])) + \
    (pulse_widths[2] * (angle - angles[0]) * (angle - angles[1])) / ((angles[2] - angles[0]) * (angles[2] - angles[1]))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X