[已解决] 对二元向量函数integral2数值积分报错:对于此运算,数组大小不兼容的问题

[复制链接]
majiejiema 发表于 2022-11-18 20:58:53
程序如下:fuce = @(x,y)fun(x,y);

q = integral2(fuce,0,1,0,1)




function [a] = fun(x,y)

a = sin((1:5).*x + 2.*y);

end


想对此二元函数进行数值积分,但总出现报错:对于此运算,数组的大小不兼容。求教大神应该如何修改呐?

但把function定义的函数改为一元函数之后,就可以积分了:
fuce = @(x)fun(x);

q = integral2(fuce,0,1,'ArrayValued',true)




function [a] = fun(x)

a = sin((1:5).*x);

end




最佳答案


小磁石 发表于 2022-11-20 15:25:47
本帖最后由 小磁石 于 2022-11-20 15:27 编辑
  1. clear;clc
  2. fuce=@(a,x,y) sin(a*x + 2.*y);
  3. q =arrayfun(@(a) integral2(@(x,y) fuce(a,x,y),0,1,0,1),(1:5));
复制代码


首先,integral2不能像integral那样按照向量值函数对函数序列进行分别积分;
其次,用arrayfun 完成intergral2的向量各序列,像积分使用的原函数向量变成integral2的序列。
具体原理请参考如下链接,虽然不是很一致
https://ww2.mathworks.cn/matlabc ... fun?s_tid=srchtitle

4 条回复


TouAkira 发表于 2022-11-19 03:04:17
你这所谓的“可以积分了”的代码,写的也不对啊,integral2函数(超链接,自己点进去看) 语法要求是
q = integral2(fun,xmin,xmax,ymin,ymax)
你写的 q = integral2(fuce,0,1,'ArrayValued',true) 显然缺了一重积分的上下限,至少20版运行不了。
然后,我理解不了你为什么要把待积分函数写成 (1:5).*x ,你到底是对 1 * x 做积分还是对 2 * x ... 做积分,如果是对一系列不同系数的待积分式做运算,为什么不规规矩矩低写个 for循环(超链接) ? 帮助文档明确写了对待积分函数 fun 的格式要求:
Integrand, specified as a function handle, defines the function to be integrated over the planar region xmin ≤ x ≤ xmax and ymin(x) ≤ y ≤ ymax(x). The function fun must accept two arrays of the same size and return an array of corresponding values. It must perform element-wise operations.
你就没想过维度到底匹配不匹配吗?

小磁石 发表于 2022-11-20 15:25:47
本帖最后由 小磁石 于 2022-11-20 15:27 编辑
  1. clear;clc
  2. fuce=@(a,x,y) sin(a*x + 2.*y);
  3. q =arrayfun(@(a) integral2(@(x,y) fuce(a,x,y),0,1,0,1),(1:5));
复制代码


首先,integral2不能像integral那样按照向量值函数对函数序列进行分别积分;
其次,用arrayfun 完成intergral2的向量各序列,像积分使用的原函数向量变成integral2的序列。
具体原理请参考如下链接,虽然不是很一致
https://ww2.mathworks.cn/matlabc ... fun?s_tid=srchtitle
回复此楼

majiejiema 发表于 2022-11-22 13:47:05
TouAkira 发表于 2022-11-19 03:04
你这所谓的“可以积分了”的代码,写的也不对啊,integral2函数(超链接,自己点进去看) 语法要求是
q =  ...

您好,确实是我发帖的时候不小心把可以积分的函数integral写成了integral2,给您造成误解,抱歉呐~另外,我的被积分函数是个用数值方法求出来的数组(向量),因此我就把help文档中的向量函数加以修改写成了sin((1:5).*x) + 2.*y,其目的是为了表示一个向量函数,并且同时对sin(x)、sin(2.*x)、sin(3.*x)...同时积分。您的建议非常有用,谢谢您啦~

majiejiema 发表于 2022-11-22 13:50:43
小磁石 发表于 2022-11-20 15:25
首先,integral2不能像integral那样按照向量值函数对函数序列进行分别积分;
其次,用arrayfun 完成inter ...

谢谢您的耐心解答,您的方法很管用,可以积分出来了。再次表示感谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表