gpt4 book ai didi

curve-fitting - 给定三个点如何计算抛物线的顶点

转载 作者:行者123 更新时间:2023-12-03 14:29:31 29 4
gpt4 key购买 nike

我有三个形成抛物线的 X/Y 点。我只需要计算通过这三个点的抛物线顶点是多少。最好是一种快速的方法,因为我必须做很多这些计算!

“Ask A Scientist”网站提供this answer :

The general form of a parabola is given by the equation: A * x^2 + B * x + C = y where A, B, and C are arbitrary Real constants. You have three pairs of points that are (x,y) ordered pairs. Substitute the x and y values of each point into the equation for a parabola. You will get three LINEAR equations in three unknowns, the three constants. You can then easily solve this system of three equations for the values of A, B, and C, and you'll have the equation of the parabola that intersects your 3 points. The vertex is where the first derivative is 0, a little algebra gives: ( -B/2A , C - B^2/4A ) for the vertex.



很高兴看到在 C# 或 C++ 中执行此计算的实际代码。有人吗?

最佳答案

这实际上只是一个简单的线性代数问题,因此您可以象征性地进行计算。当您代入三个点的 x 和 y 值时,您将得到三个未知数的三个线性方程。

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

解决这个问题的直接方法是反转矩阵
x1^2  x1  1
x2^2 x2 1
x3^2 x3 1

并乘以向量
y1
y2
y3

这样做的结果是......好吧,并不是那么简单;-)我在 Mathematica 中做过,这里是伪代码中的公式:
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

或者,如果您想以数字方式进行矩阵数学运算,您通常会转向线性代数系统(如 ATLAS ,尽管我不确定它是否具有 C#/C++ 绑定(bind))。

无论如何,一旦你有了 A 的值, B , 和 C根据这些公式计算,您只需将它们插入问题中给出的表达式中, -B / 2AC - B^2/4A ,计算顶点的坐标。1

请注意,如果原始三个点的坐标使 denom一个非常大或非常小的数字,直接进行计算可能容易出现重大的数值错误。在这种情况下,最好对其进行一些修改,以避免被分母除以它们无论如何都会抵消:
denom = (x1 - x2)(x1 - x3)(x2 - x3)
a = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2))
b = (x3^2 * (y1 - y2) + x2^2 * (y3 - y1) + x1^2 * (y2 - y3))
c = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3)

然后顶点的坐标是 -b / 2a(c - b^2 / 4a) / denom .还有许多其他情况可能会从这样的“技巧”中受益,例如 if A非常大或非常小,或者如果 C几乎等于 B^2 / 4A因此它们的差异非常小,但我认为这些情况变化很大,因此最好将完整的讨论留给逐个案例的后续问题。

将所有这些转换为您选择的语言的代码留给读者作为练习。 (在任何使用标准中缀运算符语法的语言中,它都应该是非常简单的,例如 AZDean showed in C# 。)

1在答案的初始版本中,我认为这很明显,但似乎有很多人喜欢明确提及它。

关于curve-fitting - 给定三个点如何计算抛物线的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717762/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com