Matlab数组除法异常咨询:计算绝对相对误差时结果数组元素值全部相同
解决Matlab绝对相对误差数组元素全相同的问题
嘿,我来帮你分析下为什么会出现这个问题——这其实是两个小疏忽导致的:
1. 函数内部覆盖了输入参数
你的函数定义是接受A和B作为输入参数,但函数第一行就直接给这两个变量赋值了新的linspace数组:
A = linspace(sin(-pi/6), sin(pi/6), 50); %真实值 B = linspace(-pi/6, pi/6, 50); %近似值
这意味着你调用函数时传入的任何参数都会被完全忽略,计算只会用函数内部生成的这两个数组。
2. 生成的A和B数组严格成正比例
更关键的是,你生成的这两个数组刚好是严格正比例关系:
A的起止值是sin(-pi/6) = -0.5和sin(pi/6) = 0.5,是从-0.5到0.5的50个等间距点;B的起止值是-pi/6 ≈ -0.5236和pi/6 ≈ 0.5236,是从-pi/6到pi/6的50个等间距点;- 计算比例:
-0.5 = (3/π) * (-pi/6),0.5 = (3/π) * (pi/6),而且两个数组都是等间距生成的,所以每个位置的A元素都等于对应B元素乘以3/π,即A_i = (3/π)*B_i。
代入你的误差公式后:
Y = abs((A-B) ./ A) = abs( (A - (π/3)*A) ./ A ) = abs( A*(1 - π/3) ./ A ) = abs(1 - π/3)
A被完全约掉,结果变成了一个固定常数,所以整个Y数组的所有元素自然都一样!
修正后的代码
你真正想要的应该是用B中的每个x值计算对应的sin(x)作为真实值A(用x近似sinx的场景),修正后的代码如下:
版本1:保留参数灵活性(推荐)
function [X] = absrelerror(A, B) % 针对真实值A和近似值B计算绝对相对误差 % 调用示例:B = linspace(-pi/6, pi/6, 50); A = sin(B); absrelerror(A,B) Y = abs((A-B) ./ A); % 处理A接近0的情况(避免除以0出现NaN/Inf) tolerance = 1e-10; Y(abs(A) < tolerance) = 0; % 当A的绝对值极小时,设误差为0(可根据需求调整) X = Y * 100; %转换为百分比 end
版本2:函数内部直接生成数据
如果不需要外部传入参数,也可以直接在函数内生成对应数据:
function [X] = absrelerror() % 计算x∈[-pi/6, pi/6]时,用x近似sin(x)的绝对相对误差 B = linspace(-pi/6, pi/6, 50); %近似值(x) A = sin(B); %真实值(sin(x)) Y = abs((A-B) ./ A); % 处理A接近0的边界情况 tolerance = 1e-10; Y(abs(A) < tolerance) = 0; X = Y * 100; end
这样修改后,计算出的绝对相对误差数组就会是每个元素各不相同的结果,和你手动计算的预期一致。
内容的提问来源于stack exchange,提问作者Brad Meller
相关产品推荐
相关产品推荐

