在Matlab中构建递归函数绘制自适应梯形求积图

Building a recursive function in Matlab to draw adaptive trapezoidal quadrature

我想建立一个函数,接受容差水平、上下限和函数,来计算自适应梯形正交,并画一个图,比如这个:

因为我需要节点值来绘制我的图形,所以我尝试编码如下:

function [node, approx] = aq(f,a,b,tol)
t = (b-a)*(f(b)+f(a))/2;
    if abs((t2 - t)/3) > tol %Since T(2)-T(1)=E(1)-E(2)=3*E(2)
        m = (a+b)/2;
        [node1, approx1] = aq(f,a,m,tol/2);
        [node2, approx2] = aq(f,m,b,tol/2);
        node = [node1(1:end-1) node2];
        approx = approx1+approx2;
    else
        node = [a,b];
        approx = tf;
    end
end

我的代码有两个问题:一个是 t2 显然没有定义。我不知道如何定义它,因为根据正交规则,下一个估计可能包括梯形的两侧或仅包括一个。我很困惑。也许我需要定义一个单独的函数来计算梯形面积。

第二个问题是,即使我输入一个已知整数值的函数(例如,

tol = 10^-2;

f = @(x) exp(x)*sin(x);

a=0; b=pi;

.5*(exp(pi)+1) %is our exact integral value, we can put this into the if statement

但是代码进入了无限循环。我不知道如何阻止它,因为理论上它应该收敛。

请放轻松,因为我主修数值分析 class,这是我编码的第一年。谢谢!

编辑:谢谢!成功了:)

根据上下文,t2是两段的复合梯形公式,

t2 = (b-a)/2*(f(a)+2*f(m)+f(b))/2

错误就是第二次迭代差分,前面有一些因素,

(t2-t)/3 = (b-a)/4*(-f(a)+2*f(m)-f(b))

梯形值的理查森外推法就是辛普森值

tf = (4*t2-t)/3 = (b-a)/6*(f(a)+4*f(m)+f(b))

你应该引入一些数据结构或其他机制来删除 f 在相同点的多重评估。它并不过分关键,但可能会从计算时间中删除一个重要因素。