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