使用MATLAB在x上对函数f(x)进行数值积分,其中f(x)具有另一个参数y,它是一个向量

时间:2012-09-17 21:59:08

标签: matlab vector integration numerical

我想在Matlab中数值积分一个向量,该向量表示函数f(x)超过xs和x1中的边界x0和x1指定的范围。我想检查集成的输出是否正确并且它是收敛的。

有四个和四个函数可以很好地识别所需的容错,但它们需要输入参数是一个函数,而不是函数的结果向量。还有trapz函数,我们可以输入两个向量x和f(x),但是它根据向量x使用的间距计算f(x)相对于x的积分。但是,使用trapz调整容差没有给定方式,如quad和quadl,并确保答案收敛。

我不能使用quad和quadl函数的主要问题是f(x)是以下等式: f(x)= sum(exp(-1/2 *(xy))),求和大于y,其中y是长度为n的向量,x是每次给出函数f(x)的元素)。因此,从元素x中减去向量y中的所有元素,然后计算y上的求和以给出值f(x)。这是针对m的m值完成的,其中m不等于n。

当我按照Matlab手册中的说明使用quadl时,其中f(x)在单独的函数.m文件中定义,然后在主调用文件中,我使用Q = quadl(@ f,x0,x1,容差中,X,Y);这里X是长度为m的向量,Y是长度为L的向量.Matlab给出一个错误:“???错误使用==>减去 矩阵维必须一致。“在我定义.m函数文件中函数f(x)的行.f(x)= sum(exp(-1/2 *(x-y)))

我认为问题在于Matlab将x和y视为在彼此相减时应该具有相同长度的向量,而所需要的是每次从向量X中的单个元素中减去向量Y

请您推荐一种解决此问题的方法,并成功地将f(x)与x进行数值整合,并采用控制公差的方法?

2 个答案:

答案 0 :(得分:3)

quad x开始说:

  

函数y = fun(x)应接受向量参数x并返回向量结果y,在x的每个元素处计算被积函数。

因此,每次调用函数时,我们都需要评估每个给定Y的被积函数。

另外,要使用常量向量function Q = test_num_int(x0,x1,Y) Q = quad(@(x) myFun(x,Y),x0,x1); end function fx = myFun(x,Y) fy = zeros(size(Y)); fx = zeros(size(x)); for jj=1:length(fx) for ii=1:length(Y) fy(ii) = exp(-1/2 *(x(jj)-Y(ii))); end fx(jj) = sum(fy); end end 参数化函数调用,我建议使用匿名函数调用。有一个合理的演示documentation。以下是我在Matlab中实现您的问题的方法:

Y = 0:0.1:1;
x0 = 0;
x1 = 1;
Q = test_num_int(x0,x1,Y)

Q =

   11.2544

然后我调用了该函数并获得了以下输出:

{{1}}

下限和上限以及常数数组的输入显然只是虚拟值,但积分几乎立即收敛得非常快。希望这有帮助!

答案 1 :(得分:1)

我相信以下内容也有效:

r1 <- transform(df[unlist(mylist), 1:2],value = unlist(Map(`[`, df[names(mylist)], mylist)), 
       colname = rep(names(mylist), lengths(mylist)))
row.names(r1) <- NULL
r1
#   ID location value colname
#1  M03        3     A      C1
#2  M05        5     H      C1
#3  M09        9     A      C1
#4  M10       10     B      C1
#5  M13       13     A      C1
#6  M02        2     H      C2
#7  M01        1     H      C3
#8  M03        3     A      C3
#9  M13       13     H      C3
#10 M06        6     A      C4
#11 M07        7     B      C4
#12 M05        5     B      C6
#13 M14       14     H      C6