所以我试图在Matlab中实现Simpson方法,这是我的代码:
function q = simpson(x,f)
n = size(x);
%subtracting the last value of the x vector with the first one
ba = x(n) - x(1);
%adding all the values of the f vector which are in even places starting from f(2)
a = 2*f(2:2:end-1);
%adding all the values of the f vector which are in odd places starting from 1
b = 4*f(1:2:end-1);
%the result is the Simpson approximation of the values given
q = ((ba)/3*n)*(f(1) + f(n) + a + b);
这是我得到的错误:
Error using ==> mtimes
Inner matrix dimensions must agree.
出于某种原因,即使我将q设为
q = f(n)
结果我得到了:
q =
0 1
而不是
q =
0
当我将q设为
时q = f(1)
我明白了:
q =
0
q =
0
我无法解释这种行为,这可能是我收到上述错误的原因。那么为什么q有两个值而不是一个?
编辑:x = linspace(0,pi/2,12);
f = sin(x);
答案 0 :(得分:3)
size(x)
返回数组的大小。这将是具有矩阵的所有维度的向量。 必须至少有两个维度。
在你的情况下,n=size(x)
将给出n = [N,1],而不仅仅是数组的长度。这意味着ba将有2个元素。
您可以使用length(x)
来修复此问题,numel(x)
返回最长维度而不是大小(或size(x, 1)
或a=2*sum(f(...))
或2,具体取决于x的定义方式,仅返回编号维度)
此外,您想要在a和b中求和,而现在您只需创建一个包含这些元素的向量。尝试将其更改为{{1}},类似于b。
发生错误是因为您正在对两个不同尺寸的矢量进行矩阵乘法,这是不允许的。如果您更改代码,则所有值都应为标量,以便它可以正常工作。
要得到正确的答案(3 * n)也应该在括号中,因为matlab不喜欢/和*(http://uk.mathworks.com/help/matlab/matlab_prog/operator-precedence.html)。你的版本(ba / 3)* n是错误的。