使用while循环近似acsc泰勒级数遇数组索引报错求助
问题排查与修复方案
1. 触发报错的直接原因
你遇到的「Array indices must be positive integers or logical values.」错误,根源在第9行的acsc_appr2 (i-1)调用:第一次进入while循环时i的取值为1,i-1=0,而MATLAB的数组索引必须从1开始,0属于非法索引,因此直接抛出报错。
2. 代码存在的其他逻辑问题
除了索引错误外,现有代码还有几处逻辑缺陷会导致最终结果不符合预期:
- 变量
k的使用逻辑混乱:你初始化了k(1)=0,但计算时直接调用整个k数组参与运算,会触发维度不匹配错误,且阶次迭代逻辑和泰勒展开要求不匹配 - 收敛条件错误:你当前判断的是近似值本身大于等于1e-6就继续迭代,实际应该判断相邻两次迭代的修正项差值小于阈值才停止迭代
- 结果存储逻辑错误:循环中反复覆盖
acsc_appr2数组,最终只会保留最后一个x_array(j)的迭代过程值,无法得到和x_array长度匹配的近似结果数组 - 初始值设置错误:
acsc_appr2(1)=inf不符合泰勒展开的初始项要求,acsc(x)的泰勒展开首项为1/x,后续为累加的修正项
3. 修复后的完整代码
% 注意:acsc(x)的泰勒展开仅在|x|>1区间收敛,请确保x_array取值满足该条件 acsc_appr2 = zeros(size(x_array)); % 预先初始化和x_array长度匹配的结果数组 for j = 1:length(x_array) x = x_array(j); k = 0; term = inf; % 存储单次迭代的修正项 appr_val = 0; % 存储当前x的近似计算结果 while abs(term) >= 1e-6 % 以修正项大小作为收敛判断标准 term = (factorial(2*k)/((2^(2*k)*factorial(k)^2)))*(1/((2*k+1)*(x^(2*k+1)))); appr_val = appr_val + term; k = k + 1; end acsc_appr2(j) = appr_val; % 保存当前x的最终近似结果 end % 绘图代码保持原有逻辑不变 figure(1); plot(x_array, acsc(x_array),'-k', 'LineWidth', 2); hold on plot(x_array, acsc_appr2,'--r'); hold off xlabel('x'), ylabel('y'); legend('acsc','acsc approximation', 'location', 'northeast'); title('Q4b id:30012521'); set(gcf,'Position', get(gcf,'Position') + [0,0,150,0]); pos1 = get(gcf,'Position'); set(gcf,'Position', pos1 - [pos1(3)/2,0,0,0]);
内容的提问来源于stack exchange,提问作者relue
相关产品推荐
相关产品推荐

