我在 MATLAB 中有两个向量,X 和 Y。Y
是 X 的函数,但 X 不是 Y 的函数。
对于给定的 Y 值,我想从 spline(X,Y) 获取 X 值。
我怎样才能做到这一点?我尝试使用样条曲线的 pp ,但我并没有走得太远。
你自己说 x 不是 y 的函数。这意味着该问题有多种解决方案,至少对于一些 y 值。
您有多种选择,具体取决于您在 MATLAB 中使用 pp 形式的设施。如果您先...
使用包围方案来识别存在根的区间。如果样条曲线在给定区间内是非单调的,您可能需要在这里变得棘手,但不难找到三次多项式达到其最大值/最小值的位置,因为这只需找到二次多项式。
一旦你有一个解决方案的时间间隔:
您可以使用 fzero,找到 (f(x)-y) 的解。虽然 fzero 在大多数情况下不需要括号来工作,但如果在糟糕的情况下可能无法找到解决方案。如果你提供一个括号,那么如果有多个解决方案,fzero 会找到你选择的解决方案。(在那种情况下,我设置了一条由客户规定的规则,即我将始终选择最右边或最左边的解决方案。)
您可以在所选 pp 段上使用根。这当然比使用 fzero 更快,并且更准确。当然,根会返回多个解决方案,因此您需要选择正确的根。其中一些解决方案可能是需要剔除的复数。
您可以对三次多项式的根使用显式解。它当然会再次返回多个解决方案,因此您需要小心您采用哪种解决方案。
如果您仔细编写代码,最后一种解决方案是最快的。事实上,它可以被矢量化以一次解决所有点。(完成后,我会断言它可以完成。好吧,实际上,这是给当时为我工作的合作学生的编程作业。)
我猜你为什么没有正确使用 pp 表格是你不明白 pp 表格是如何工作的。这对于正确使用这些工具当然是必不可少的。
尝试绘制样条曲线的单个 pp 段。使用 ppval 对其进行评估。起初它似乎无法正常工作吗?这意味着您误解了这些段是左移的,因此 ANY 间隔的左侧端点始终假定为零。这使得三次多项式段更准确地评估,具体取决于样条的断点。例如,如果函数值相同,则具有断点 [0 1 2 3] 的样条曲线和具有断点 [1000001 1000001 1000002 1000003] 的样条曲线应该以相同的方式工作。看到这将是浮点算术中的一个数值问题,当你把数字立方那么大时。
再一次,我什至会断言所有这些都可以仔细矢量化,尽管我们这样做时需要一些脑力劳动。总体而言,最简单的解决方案是使用 fzero,正如我所描述的那样。
你可以使用lsqnonlin
.
使 fun 参数成为计算样条曲线的函数,并减去所需的 Y 值,以便在达到所需的 Y 值时结果为零。