我正在学习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
1条答案
按热度按时间qpgpyjmq1#
我做了一些修改和评论。