我正在关注this thread并复制了我项目中的代码。玩弄它看起来似乎不是很精确。
回想一下公式:y = ax ^ 2 + bx + c
由于我的第一个给定点是x1 = 0,我们已经有c = y1。我们只需要找到a和b。使用:
y2 = ax2 ^ 2 + bx2 + c y3 = ax3 ^ 2 + bx3 + c
求解b的方程式:
b = y / x - ax - cx
现在将两个方程设置为彼此相等,以便b掉出
y2 / x2 - ax2 - cx2 = y3 / x3 - ax3 - cx3
现在求解一个给我:
a =(x3 *(y2 - c)+ x2 *(y3 - c))/(x2 * x3 *(x2 - x3))
(这是正确的吗?!)
然后再次使用b = y2 / x2 - ax2 - cx2来找到b。但到目前为止,我还没有找到正确的a和b系数。我做错了什么?
修改
好的我想通了,但不得不使用CAS,因为我不知道如何手动反转符号矩阵。 (高斯算法似乎不起作用)
以矩阵形式写下来:
| 0 0 1 | |a|
| x2^2 x2 1 | * |b| = Y
| x3^2 x3 1 | |c|
让我们调用矩阵M并从左边乘以M ^( - 1)
|a|
|b| = M^(-1)*Y
|c|
然后我离开了枫树:
a = (-y1 * x2 + y1 * x3 - y2 * x3 + y3 * x2) / x2 / x3 / (-x2 + x3)
猜猜我在上面某处犯了一个愚蠢的错误。
这给我的结果与上面引用的主题中的公式相同。
答案 0 :(得分:4)
你的问题是你有三个未知数(系数a,b和c),我只能看到一个方程:当x = 0时y = y1;正如你所说,这给出了c = y1。
如果没有更多信息,您所能做的就是告诉b如何与a相关。而已。没有一种解决方案,有很多解决方案。
如果你告诉我你有两个其他点(x2,y2)和(x3,y3),那么你应该将它们全部替换成等式并求解。从:
开始alt text http://www.equationsheet.com/latexrender/pictures/41a2186ee8f0fcad42693e5c6211e258.gif
现在替换三个点(x1,y1),(x2,y2)和(x3,y3):
alt text http://www.equationsheet.com/latexrender/pictures/4929b2060c4fe90914da0ac237f68e38.gif
这是您需要反转的矩阵方程。您可以使用Cramer的规则或LU分解。另一种可能性是Wolfram Alpha:
http://www.wolframalpha.com/input/?i=inverse{{x1*x1,+x1,+1},+{x2*x2,+x2,+1},+{x3*x3,+x3,+1}}
取链接给你的反转并乘以右边的矢量来求解你的三个系数。
如果你注意到
那么代码就很容易了det =(x2 x1 ^ 2-x3 x1 ^ 2-x2 ^ 2 x1 + x3 ^ 2 x1-x2 x3 ^ 2 + x2 ^ 2 x3)
将矩阵中的所有条目除以此值。分子非常简单:
alt text http://www.equationsheet.com/latexrender/pictures/93fc1a5b2cfddcc8685045937396cee3.gif
将此除以行列式,你得到了反转。
如果您的分数超过三分,则需要进行最小二乘拟合。用你所有的点(x1,y1)替换相同的技巧(xn,yn)。你将拥有比未知数更多的方程式。通过nx3矩阵的转置将两侧相乘并求解。 Voila - 你将拥有一系列系数来最小化点和函数值之间的误差平方。