You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:37:36