"Array indices must be positive integers or logical values"

"Array indices must be positive integers or logical values"

Problem Details and clues

%For this problem write a script file called NC.m that implements 
%the Newton-Cotes method of integration for an arbitrary function f(x). It
%should take as inputs the function and the limits of integration [a: b] and
%output the value of the definite integral. Specifically, you should use the
%Trapezoid rule as presented in Equation (11.73)
function [f]= NC(a,b,fun) %newton-cotes 
%a and b are limits of intergration 
%setting it up 
f(a)= fun(a); %y value for lower limit 
f(b)= fun(b); %y value for upper limit 
%the actual function 
f= (b-a)*(f(a)+f(b))/2; 
end 
 

我做错了什么?当我输入时, [f]= NC(-3,0,fun) 并设置 fun= @(x)normpdf(x) 。它不断返回“数组索引必须是正整数或逻辑值”。有人可以对此有所启发吗?

问题是您尝试将 f(a) 分配给 a=0,因此您混合了向量索引和值,以及将 f 用于两个不同的目的,一个作为函数 NC 的输出,一个作为 fun(x) 的值,这不是一个好主意。

相反,您可以在单独的变量中定义输出:

fa=fun(a);
fb=fun(n); 
f=(b-a)*(fa+fb)/2;

或者直接写:f=(b-a)*(fun(a)+fun(b))/2;

问题出在对f(a)f(b)的赋值上。

语法 f(x) 在 MATLAB 中有三种解释,这取决于 f 的类型:

  1. 使用严格的正整数索引(或逻辑索引)索引数组 f x
  2. 使用变量 x
  3. 的值计算函数句柄 f
  4. 使用符号变量 x.
  5. 以某种方式操纵符号函数f(x)

由于 MATLAB 的动态类型和默认双数组,MATLAB 将 f(a)f(b) 的赋值解释为第 (1) 项:MATLAB 将 f 解释为一个双数组,并期望 ab 是数组的有效索引。

那么,根据您的意图,对不带括号的变量符号(例如,fafb)进行简单赋值即可解决您的问题。