我想在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进行数值整合,并采用控制公差的方法?
答案 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