【问题标题】:Shape preserving clamped ends interpolation in MatlabMatlab中的形状保持钳位插值
【发布时间】:2012-01-30 15:27:19
【问题描述】:

我正在 Matlab 中寻找一种算法,它可以保留我的数据的形状,同时允许我夹住末端。我试图从弦线、前缘角、后缘角和最大外倾角的位置生成外倾线。有关定义,请参阅Airfoil terminology。使用该信息,我想在前缘和后缘之间生成任意数量的点,在弦上均匀分布。

以下是我目前评估过的算法:

'pchip' 似乎不允许夹紧,除非我在搜索时重复输入错误,但确实提供了适当的形状保留。

'spline' 不保留形状。使用 3 个数据点,中间数据点为最大外倾角,两端夹紧,样条不能保证中间数据为生成曲线上的最高点。有关该行为的示例,请参阅此 answer

'csape' 提供了足够的结束条件,但我不能确定它是否充分保持形状。

【问题讨论】:

    标签: matlab interpolation


    【解决方案1】:

    如果您的数据只有这三个点,您可以分两个阶段进行,一个用于上半场,下一个用于下半场。您可以利用这样一个事实,即在离弦线最远的点(中点),线的梯度将为零。

    将每条线生成为两点之间的样条线,每一端都在指定的角度。

    X = [0 5 10];
    Y = [0 3 2];
    start_slope = 0;
    end_slope = -0.7;
    
    xx1 = linspace(X(1), X(2), 100);
    xx2 = linspace(X(2), X(3), 100);
    yy1 = spline(X(1:2), [start_slope, Y(1:2), 0], xx1);
    yy2 = spline(X(2:3), [0, Y(2:3), end_slope], xx2); 
    
    plot([xx1, xx2],  [yy1, yy2]);
    hold on
    scatter(X, Y, 'filled')
    

    【讨论】:

    • 谢谢,这几乎正是我所需要的。您将如何沿弦线生成偶数个均匀分布的点? (当然没有中间点重复)
    • 上例中的数字 100 是为线的每个部分生成的点数。如果您的中间点不是死点,您可能需要使用 linspace 来在两半之间按比例分配点。最后,从 yy2 中删除第一个点以消除重复。
    • 糟糕!样条过冲。在您的图表上,在 6 左右,y 轴上的值大于“顶点”的值。此外,兴趣点,轴可以是弦。含义 Y = [0 3 0]。
    • 嗯...是的,我想这是真的,样条曲线可以向另一个方向弯曲。克服这一点可能很困难。您想在整个下半场强制斜率 >= 0,我不确定是否可以使用任何内置的 MATLAB 插值来完成。
    • 因此我将“pchip”评估为插值器和“csape”。我还认为,对坡度的硬性限制并不能定义合适的翼型。
    【解决方案2】:

    我已经在数学堆栈交换上发布了我的问题,并得到了以下answer。本质上,我可以使用 Fritsch-Carlson 方案来计算/设置数据点的斜率。如果我想将斜率设置为我的中间点,我会将我的间隔分成两部分,就像 Bill Cheatham 建议的那样。

    我还可以包装我的数据并使用 pchip 或样条曲线来应用点,而不是重新实现整个方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2016-12-22
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2021-11-09
      相关资源
      最近更新 更多