【问题标题】:How to extrapolate matrix valued functions on Matlab?如何在 Matlab 上推断矩阵值函数?
【发布时间】:2014-04-24 21:02:56
【问题描述】:

我有一个矩阵值函数,我试图在 x 变为 1 时找到它的极限。

所以,在这个例子中,我有三个矩阵 v1-3,分别代表 [0.85, 0.9, 0.99] 处的采样值。我现在做的,效率很低,如下:

for i=1:101
 for j = 1:160
  v_splined = spline([0.85,0.9,0.99], [v1(i,j), v2(i,j), v3(i,j)], [1]);
 end
end

必须有更好更有效的方法来做到这一点。尤其是当我很快就会面对 v 将是 4-5 维向量的情况。

谢谢!

【问题讨论】:

    标签: matlab matrix numerical-methods spline extrapolation


    【解决方案1】:

    免责声明:天真的推断是有风险的业务,风险自负

    这就是我要说的

    1. 使用样条进行推断是有风险的业务,通常不建议这样做。你知道你的函数在 x=1 附近的行为吗?
    2. 在只有 3 个点的情况下,最好使用二阶多项式(抛物线)而不是通过三个点拟合样条曲线。 (除非您有充分的理由不这样做。)
    3. 如果你想使用抛物线(或更高阶的插值多项​​式,当你有更多的点),你可以矢量化你的代码并使用LagrangeNewton 多项式来执行外推,这可能会给你一个不错的速度向上。
    4. 使用插值多项式也可以轻松推广到给出更多点的高阶多项式。但是,由于高阶插值多项式在域末端附近往往会剧烈振荡,因此这会使外推更加冒险。

    如果你想用拉格朗日多项式形成抛物线,你的结果是:

    v_splined = v1*(1-.9)*(1-.99)/( (.85-.9)*(.85-.99) ) ...
               +v2*(1-.85)*(1-.99)/( (.9-.85)*(.9-.99) ) ...
               +v3*(1-.85)*(1-.9)/( (.99-.85)*(.99-.9) );
    

    我没有简化这个,所以你可以看到它是如何从拉格朗日多项式得出的,但显然简化很容易。另请注意,这消除了循环的需要。

    【讨论】:

    • 您好,Doug,谢谢您的帮助。以下是您的问题的一些答案:
    • 这里是您问题的一些答案:(1)在 x=1 附近,矩阵中的一些值变得无限(从数学上讲),因为它是 NLS 的奇异解(2)这是为什么我不“强迫”外推到抛物线。我可以生成更多点,但它们都将小于 0.995,我的模拟已经中断。
    • 即使不使用抛物线,样条函数也会“强制”三次多项式。此外,在远离 x=1 的地方添加更多点对 x=1 附近的样条行为影响相对较小,您的外推几乎完全由最接近 1 的三个点和您选择的边界条件(例如自然、非节,规定的坡度)。如果不了解 x=1 附近的功能行为,我不确定还有什么建议。
    • 如果您绝对确定在 x=1 处存在奇点,则对 (x,y*(x-1)) 进行线性或二次插值/近似得到 p(x )/(x-1)。
    • @LutzL 这当然是假设奇点是一阶极点。它可能是更高阶的极点或不同类型的奇点。
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多