在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
在相同点的多重评估。它并不过分关键,但可能会从计算时间中删除一个重要因素。
我想建立一个函数,接受容差水平、上下限和函数,来计算自适应梯形正交,并画一个图,比如这个:
因为我需要节点值来绘制我的图形,所以我尝试编码如下:
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
在相同点的多重评估。它并不过分关键,但可能会从计算时间中删除一个重要因素。