复合梯形规则未在Octave中运行

时间:2015-05-11 16:03:24

标签: octave numerical-methods numerical-integration

我在Octave中有以下代码用于实现复合梯形规则,并且由于某种原因,只要我在Octave上执行它,f = @(x)x ^ 2,a = 0,b = 4,TOL时该函数才会停止= 10 ^ -6。每当我调用trapezoid(f,a,b,TOL)时,没有任何反应,我必须退出终端才能在Octave中执行任何其他操作。这是代码:

% INPUTS
%
% f   : a function
% a   : starting point
% b   : endpoint
% TOL : tolerance

function root = trapezoid(f, a, b, TOL)
disp('test');
max_iterations = 10000;
disp(max_iterations);
count = 1;
disp(count);
initial = (b-a)*(f(b) + f(a))/2;
while count < max_iterations
disp(initial);
trap_0 = initial;
trap_1 = 0;
trap_1_midpoints = a:(0.5^count):b;
for i = 1:(length(trap_1_midpoints)-1)
    trap_1 = trap_1 + (trap_1_midpoints(i+1) - trap_1_midpoints(i))*(f(trap_1_midpoints(i+1) + f(trap_1_midpoints(i))))/2;
endfor
if abs(trap_0 - trap_1) < TOL
    root = trap_1;
    return;
endif
intial = trap_1;
count = count + 1;
disp(count);
endwhile

disp(['Process ended after ' num2str(max_iterations), ' iterations.']);

2 个答案:

答案 0 :(得分:1)

我在Matlab中尝试过你的功能。 你的代码没有停滞不前。相反,trap_1_midpoints的大小会逐渐增加。由此,trap_1的计算时间也逐渐增加。这就是你停滞不前的经历。

我还在代码中发现了一个可能的错误。我想if子句后面的行应该是initial = trap_1。检查遗失的&#39; i&#39;。

有了这个,您的代码仍然需要永远,但如果您增加容差(例如,值为1),您的代码将返回。

您可以尝试对for循环进行矢量化以加快速度。

修改:我认为在你的for循环中,)之后缺少f(trap_1_midpoints(i+1)

答案 1 :(得分:0)

在大约count=52之后,算术序列trap_1_midpoints在浮点数中不再以任何有意义的方式表示。在count=1075或类似之后,步长不再可表示为正浮点double数。这就是说,绑定max_iterations = 10000是荒谬的。如下所述,count=20之后的所有计算都没有意义。

stepsize h的理论错误是O(T·h^2)。在具有该大小的O(T/h)数字的总和中存在数值误差累积,即O(mu/h)mu=1ulp=2^(-52)。这总体意味着数字积分的最低误差可以预期在h=mu^(1/3)附近,对于双数,因此h=1e-5或算法count=17。这可能会随着间隔长度以及功能的平滑或波动而变化。

可以预期错误除以4的行为,同时仅对于此边界1e-5以上的步长减半步长。这也意味着abs(trap_0 - trap_1)trap_0(以及abs(trap_0 - trap_1)/3 trap_1)错误的可靠衡量标准。仅在此步长范围内。

大约TOL=1e-6应该符合h=1e-3的误差范围,该count=10对应于count = 14。如果1e-8的递归没有停止(这应该给出小于Ext.define('demoapp.view.MainMenu',{ extend:'Ext.form.Panel', requires:['Ext.TitleBar','demoapp.store.CCAA'], alias:'widget.mainmenuview', config:{ layout:{ type:'fit' }, items:[{ xtype:'fieldset', items:[{ xtype:'titlebar', title:'Menú principal', docked:'top', items:[{ xtype:'button', text:'Desconectar', itemId:'logOffButton', align:'right' }] }, { xtype:'fieldset', items:[{ xtype:'selectfield', itemId:'CCAAcombo', label:'Comunidad Autonoma', store:'storeCCAA', displayField:'nombre', valueField:'id', autoSelect:false, placeHolder:'Elige una para filtrar' }] } ] }], listeners:[{ delegate:'#logOffButton', event:'tap', fn:'onLogOffButtonTap' }, { delegate:'#CCAAcombo', event:'change', fn:'onCCAAcomboChange' }] }, onLogOffButtonTap:function(){ this.fireEvent('onSignOffCommand'); }, onCCAAcomboChange:function(field,value){ console.log("ESTOY EN LA VISTA"); var idCCAA=value; console.log(idCCAA); this.fireEvent('onCCAAcomboChangeAction',idCCAA); } }); 的错误),那么该方法就不能准确实现。