matlab 插值多项式的值与原函数值的最大偏差模

9njqaruj  于 2023-05-01  发布在  Matlab
关注(0)|答案(1)|浏览(156)

我正在学习GNU八度音阶的计算,并且正在为下面的任务而挣扎。
假设给定插值节点X并且定义函数拉格朗日(X,Y,x 0)和original_function(x 0),其计算在点x 0处的插值多项式和原始插值函数的值。并且delta_max(Y1,Y2)函数也已经被定义。
我需要写一段代码,查看区间[xmin,xmax]中的每个点,步长为h=xmax−xmin /100 N(N是插值区间的数量),并找到插值多项式的值与原始函数值的偏差的最大模,以及这个最大值本身的值。
任务的输入/输出格式:

样本输入:

1 2 3

样本输出:

h = 0.010000
x_delta_max = 2.6100
delta = 0.58020

**我正在努力在给定的时间(13秒)内提供答案。”””有什么明显的我错过了吗?

我需要使用GNU Octave来完成这个任务,但是如果有任何关于代码整体结构的建议(例如:例如,我犯的错误不是特定于八度的),MatLab示例将是有用的。
首先,我计算了步长和这个区间内所有点的数组。x_h表示X坐标,y_h表示Y坐标。在接下来的步骤中,我试图计算插值多项式在每个给定点的值(如任务中所述)。我想我在这一刻做错了什么,因为最后一个操作(delta_max)相对简单。

h = (X(end) - X(1)) / (100 * (size(X, 2) - 1));
x_h = X(1):h:X(end);
y_h = arrayfun(@original_function, x_h);
lagr = arrayfun(@(x) lagrange(x_h, y_h, x), x_h);
[delta, x_delta_max] = delta_max(y_h, lagr);

但是这段代码需要太长的时间来执行,我总是超出任何时间限制。
下面是拉格朗日(X,Y,x 0),original_function(x 0)和delta_max(Y1,Y2)的代码。
拉格朗日()函数计算给定点处的插值多项式的值。插值节点的X - x坐标,插值节点的Y - y坐标,x 0-计算值的点

function y0 = lagrange(X,Y,x0)
    y0 = 0;
    n = size(X, 2);
    for i = 1:n
        p = 1;
        for j = 1:n
            if (j != i)
                p *= (x0 - X(j)) / (X(i) - X(j));
            endif;
        endfor;
        y0 += Y(i) * p;
    endfor;
    return;
endfunction

原始函数(x 0)

function y0=original_function(x0)
    y0 = exp(x0);
endfunction

delta_max(Y1,Y2)

function [delta, i] = delta_max(Y1,Y2)
    delta = 0;
    i = 1;
    n = size(Y1, 2);
    for j=1:n
        if abs(Y1(j) - Y2(j)) > delta
            delta = abs(Y1(j) - Y2(j));
            i = j;
        endif;
    endfor;
endfunction
qpgpyjmq

qpgpyjmq1#

我做了一些修改和评论。

clear

function y0 = lagrange(X,Y,x0)
    y0 = 0;
    n = size(X, 2);
    for i = 1:n
        p = 1;
        for j = 1:n
            if (j != i)
##            Use .* for elementwise operating
              p = p.*(x0 - X(j)) / (X(i) - X(j));
            endif;
        endfor;
        y0 += Y(i) * p;
    endfor;
## I removed the "return" command
endfunction

function y0=original_function(x0)
    y0 = exp(x0);
endfunction

function [delta, i] = delta_max(Y1,Y2)
    delta = 0;
    i = 1;
    n = size(Y1, 2);
    for j=1:n
        if abs(Y1(j) - Y2(j)) > delta
            delta = abs(Y1(j) - Y2(j));
            i = j;
        endif;
    endfor;
endfunction

# You can call the functions directly by its name
X = [1, 2, 3]
Y = original_function(X)
h = (X(end) - X(1)) / (100 * (size(X, 2) - 1))
x_h = X(1):h:X(end)
y_h = original_function(x_h)
lagr = lagrange(X, Y, x_h)
[delta, x_delta_max] = delta_max(y_h, lagr);

相关问题