我在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.']);
答案 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);
}
});
的错误),那么该方法就不能准确实现。