vertical una tres sacar que puntos por pase pasa paralelo parabola los hallar encontrar ejemplos eje ecuacion dela cuyo curva con como curve-fitting

curve-fitting - tres - hallar la ecuacion de una parabola de eje vertical y que pase por los puntos(4 5)(-2 11) y(-4 21)



Cómo calcular el vértice de una parábola dados tres puntos (9)

Aquí hay un código en Fortran que implementa la solución de @ david-z y @ AZDean:

subroutine parabola_vertex(x1, y1, x2, y2, x3, y3, xv, yv) real(dp), intent(in) :: x1, y1, x2, y2, x3, y3 real(dp), intent(out) :: xv, yv real(dp) :: denom, A, B, C denom = (x1 - x2) * (x1 - x3) * (x2 - x3) A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom B = (x3**2 * (y1 - y2) + x2**2 * (y3 - y1) + x1**2 * (y2 - y3)) / denom C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + & x1 * x2 * (x1 - x2) * y3) / denom xv = -B / (2*A) yv = C - B**2 / (4*A) end subroutine

Tengo tres puntos X / Y que forman una parábola. Simplemente necesito calcular cuál es el vértice de la parábola que atraviesa estos tres puntos. Preferiblemente una manera rápida ya que tengo que hacer MUCHOS de estos cálculos!

El sitio web "Pregúntele a un científico" ofrece esta respuesta :

La forma general de una parábola viene dada por la ecuación: A * x ^ 2 + B * x + C = y donde A, B y C son constantes reales arbitrarias. Tienes tres pares de puntos que son (x, y) pares ordenados. Sustituye los valores x e y de cada punto en la ecuación de una parábola. Obtendrás tres ecuaciones LINEALES en tres incógnitas, las tres constantes. Luego, puede resolver fácilmente este sistema de tres ecuaciones para los valores de A, B y C, y tendrá la ecuación de la parábola que interseca sus 3 puntos. El vértice es donde la primera derivada es 0, un poco de álgebra da: (-B / 2A, C - B ^ 2 / 4A) para el vértice.

Sería bueno ver el código real que hace este cálculo en C # o C ++. ¿Nadie?


Corriendo en https://ideone.com/y0SxKU

#include <iostream> using namespace std; // calculate the vertex of a parabola given three points // https://.com/q/717762/16582 // @AZDean implementation with given x values void CalcParabolaVertex(int x1, int y1, int x2, int y2, int x3, int y3, double& xv, double& yv) { double denom = (x1 - x2) * (x1 - x3) * (x2 - x3); double A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom; double B = (x3*x3 * (y1 - y2) + x2*x2 * (y3 - y1) + x1*x1 * (y2 - y3)) / denom; double C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom; xv = -B / (2*A); yv = C - B*B / (4*A); } // @piSHOCK immplementation assuming regular x values ( wrong!!! ) void CalcParabolaVertex2( int y1, int y2, int y3, double& xv, double& yv) { double d1 = y1 - y2; double d2 = y1 - y3; double a = -d1 + 0.5 * d2; double b = 2 * d1 - 0.5 * d2; double c = -y1; xv = -0.5 * b / a; yv = c - 0.25 * b * b / a; } // corrected immplementation assuming regular x values void CalcParabolaVertex3( int y1, int y2, int y3, double& xv, double& yv) { double d1 = y1 - y2; double d2 = y1 - y3; double a = d1 - 0.5 * d2; double b = -2 * d1 + 0.5 * d2; double c = y1; xv = -0.5 * b / a; yv = c - 0.25 * b * b / a; } int main() { double xv, yv; CalcParabolaVertex( 0, 100, 1, 500, 2, 200, xv, yv ); cout << xv <<" "<< yv << "/n"; CalcParabolaVertex2( 100, 500, 200, xv, yv ); cout << xv <<" "<< yv << "/n"; CalcParabolaVertex3( 100, 500, 200, xv, yv ); cout << xv <<" "<< yv << "/n"; return 0; }

He agregado un par de pruebas de unidad para los picos negativos: ejecución en vivo en https://ideone.com/WGK90S


Esto es realmente un problema simple de álgebra lineal, por lo que puede hacer el cálculo simbólicamente. Cuando sustituyas los valores x e y de tus tres puntos, obtendrás tres ecuaciones lineales en tres incógnitas.

A x1^2 + B x1 + C = y1 A x2^2 + B x2 + C = y2 A x3^2 + B x3 + C = y3

La manera más sencilla de resolver esto es invertir la matriz.

x1^2 x1 1 x2^2 x2 1 x3^2 x3 1

y multiplicarlo por el vector

y1 y2 y3

El resultado de esto es ... bueno, no es exactamente tan simple ;-) Lo hice en Mathematica, y aquí están las fórmulas en pseudocódigo:

denom = (x1 - x2)(x1 - x3)(x2 - x3) A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom B = (x3^2 * (y1 - y2) + x2^2 * (y3 - y1) + x1^2 * (y2 - y3)) / denom C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom

Alternativamente, si quisiera hacer la matriz matemáticamente numéricamente, normalmente recurriría a un sistema de álgebra lineal (como ATLAS , aunque no estoy seguro si tiene enlaces C # / C ++).


Esto huele a tarea. "Pregúntale a un científico" está en lo correcto. Digamos que sus 3 puntos son (x1, y1), (x2, y2), y (x3, y3). Entonces, obtienes tres ecuaciones lineales:

| M11 M12 M13 | | A | | Z1 | | M21 M22 M23 | * | B | = | Z2 | | M31 M32 M33 | | C | | Z3 |

Donde M 11 = x 1 2 , M 12 = x 1 , M 13 = 1, Z 1 = y 1 , y de manera similar para las otras dos filas usando (x2, y2) y (x3, y3) en lugar de (x1, y1).

Resolver este sistema de 3 ecuaciones le dará una solución para A, B y C.


Gracias David, convertí tu pseudocódigo al siguiente código C #:

public static void CalcParabolaVertex(int x1, int y1, int x2, int y2, int x3, int y3, out double xv, out double yv) { double denom = (x1 - x2) * (x1 - x3) * (x2 - x3); double A = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denom; double B = (x3*x3 * (y1 - y2) + x2*x2 * (y3 - y1) + x1*x1 * (y2 - y3)) / denom; double C = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denom; xv = -B / (2*A); yv = C - B*B / (4*A); }

Esto es lo que quería. Un simple cálculo del vértice de la parábola. Voy a manejar el desbordamiento de enteros más tarde.


He hecho algo similar a la respuesta de @PLSHOCK, también basado en el código de @ AZDean. Si necesita ejecutarlo en gran medida (o usarlo en Matlab como yo), este podría ser el más rápido.

Mi suposición es que x1 == -1, x2 == 0, x3 == 1 .

a = y2 - ( y1 + y3) / 2 % opposite signal compared to the original definition of A b = (y3 - y1) / 4 % half of the originally defined B xExtr = b / a yExtr = y2 + b * yExtr % which is equal to y2 + b*b / a


Obtienes las siguientes tres ecuaciones por sustitución directa:

A*x1^2+B*x1+C=y1 A*x2^2+B*x2+C=y2 A*x3^2+B*x3+C=y3

Puede resolver esto observando que esto es equivalente al producto de matriz:

[x1^2 x1 1] [A] [y1] |x2^2 x2 1|*|B| = |y2| [x3^2 x3 1] [C] [y3]

Así que puedes obtener A, B y C invirtiendo la matriz y multiplicando el inverso con el vector de la derecha.

Veo que mientras he publicado este artículo, John Rasch se ha vinculado a un tutorial que profundiza en la resolución de la ecuación matricial, por lo que puede seguir esas instrucciones para obtener la respuesta. Invertir una matriz de 3x3 es bastante fácil, por lo que no debería ser demasiado difícil.


Si asume que x1 == 0, x2 == 1, x3 == 2 , por ejemplo, al ajustar una curva localmente a una señal muestreada de manera uniforme, el código de @AZDean se simplifica a:

d1 = y1 - y2 d2 = y1 - y3 a = d1 - 0.5 * d2 b = -2 * d1 + 0.5 * d2 c = y1 xVertex = -0.5 * b / a yVertex = c - 0.25 * b * b / a


def vertex(x1,x2,x3,y1,y2,y3): ''''''Given three pairs of (x,y) points return the vertex of the parabola passing through the points. Vectorized and common expression reduced.'''''' #Define a sequence of sub expressions to reduce redundant flops x0 = 1/x2 x4 = x1 - x2 x5 = 1/x4 x6 = x1**2 x7 = 1/x6 x8 = x2**2 x9 = -x7*x8 + 1 x10 = x0*x1*x5*x9 x11 = 1/x1 x12 = x3**2 x13 = x11*x12 x14 = 1/(x0*x13 - x0*x3 - x11*x3 + 1) x15 = x14*y3 x16 = x10*x15 x17 = x0*x5 x18 = -x13 + x3 x19 = y2*(x1*x17 + x14*x18*x6*x9/(x4**2*x8)) x20 = x2*x5 x21 = x11*x20 x22 = x14*(-x12*x7 + x18*x21) x23 = y1*(-x10*x22 - x21) x24 = x16/2 - x19/2 - x23/2 x25 = -x17*x9 + x7 x26 = x0*x1*x14*x18*x5 x27 = 1/(-x15*x25 + y1*(x20*x7 - x22*x25 + x7) + y2*(-x17 + x25*x26)) x28 = x24*x27 return x28,x15 + x22*y1 + x24**2*x27 - x26*y2 + x28*(-x16 + x19 + x23)