[已解决] MATLAB使用integral计算积分时要求定义function_handle对应函数

[复制链接]
leihaofule 发表于 2018-1-25 14:08:44
clear all
SNR=1;
syms r
x=@(r) sqrt(2.*r);
Q_Approx=@(r) (1/16).*exp(-x(r).^2/2)+(1/8).*exp(-x(r).^2)+(1/8).*exp(-10.*x(r).^2/3)+(1/8).*exp(-10.*x(r).^2/17);
SNRLin = 10.^(SNR/10);
p=@(r) (SNRLin.^(-1)).*(exp(-r.*(SNRLin.^(-1))));
fun=@(r) p(r).*(Q_Approx(r));
BER=integral(@(r) fun,0,Inf,'ArrayValued',true)


如上述代码,r是积分自变量,x是与r相关的一个函数,Q_Approx是自变量为x的一个函数,p也是由r定义的函数,fun将p和Q_Approx相乘,需要计算fun的从0-正无穷的积分

报错如下
未定义与 'function_handle' 类型的输入参数相对应的函数 'times'。

出错 integralCalc/iterateArrayValued (line 156)
                fxj = FUN(t(1)).*w(1);

出错 integralCalc/vadapt (line 130)
            [q,errbnd] = iterateArrayValued(u,tinterval,pathlen);

出错 integralCalc (line 83)
        [q,errbnd] = vadapt(@AToInfInvTransform,interval);

出错 integral (line 88)
Q = integralCalc(fun,a,b,opstruct);

出错 test1 (line 9)
BER=integral(@(r) fun,0,Inf,'ArrayValued',true)
希望得到大佬的解答,非常感谢

最佳答案


风之子儿 发表于 2018-1-25 14:58:33
我这里只说几点问题与建议:

首先,你的第一条提示:
  1. 未定义与 'function_handle' 类型的输入参数相对应的函数 'times'。
复制代码

应该是
  1. Undefined operator '.*' for input arguments of type 'function_handle'
复制代码

意思是“函数句柄间不存在点乘操作符”

其次,你的integral用的太乱了,前面有符号计算又有函数句柄,第二次在论坛看到这种操作了,真不知道你们在什么资料书学的(我都想骂了),建议多看帮助文档。

end,解决的方法:因为你要乘好几个函数,有个什么函数,算了忘了。这里你可以弄个子函数。例如:

  1. function  integralcul
  2. integral(@compute,0,pi)
  3. function f=compute(x)
  4. y = x.^2;
  5. z=sin(x);
  6. f=y.*z;
复制代码


回复此楼

7 条回复


风之子儿 发表于 2018-1-25 14:58:33
我这里只说几点问题与建议:

首先,你的第一条提示:
  1. 未定义与 'function_handle' 类型的输入参数相对应的函数 'times'。
复制代码

应该是
  1. Undefined operator '.*' for input arguments of type 'function_handle'
复制代码

意思是“函数句柄间不存在点乘操作符”

其次,你的integral用的太乱了,前面有符号计算又有函数句柄,第二次在论坛看到这种操作了,真不知道你们在什么资料书学的(我都想骂了),建议多看帮助文档。

end,解决的方法:因为你要乘好几个函数,有个什么函数,算了忘了。这里你可以弄个子函数。例如:

  1. function  integralcul
  2. integral(@compute,0,pi)
  3. function f=compute(x)
  4. y = x.^2;
  5. z=sin(x);
  6. f=y.*z;
复制代码


回复此楼

leihaofule 发表于 2018-1-25 15:32:21
风之子儿 发表于 2018-1-25 14:58
我这里只说几点问题与建议:

首先,你的第一条提示:

抱歉,我是初学者,其实要骂也是可以的哈哈。以为定义这几个函数,然后相乘的时候,函数之间都是要点乘的。。所以不需要点乘是么,
其次integral具体格式应该如何使用呢,烦请朋友再看一下

风之子儿 发表于 2018-1-25 15:42:49
leihaofule 发表于 2018-1-25 15:32
抱歉,我是初学者,其实要骂也是可以的哈哈。以为定义这几个函数,然后相乘的时候,函数之间都是要点乘的 ...

这个你可以doc integral查看即可。

风之子儿 发表于 2018-1-25 15:52:57
leihaofule 发表于 2018-1-25 15:32
抱歉,我是初学者,其实要骂也是可以的哈哈。以为定义这几个函数,然后相乘的时候,函数之间都是要点乘的 ...

点乘是需要的,因为它是函数本身的法则,对应相乘。
不能点乘是由于你y=@(x)x生成的是函数句柄,比方讲就是手把,有点像索引。还有你的函数中的x(r),x(1)是可以,你的要表达原式,直接x即可。day day up。

MSXLJX 发表于 2019-10-13 21:41:38
风之子儿 发表于 2018-1-25 14:58
我这里只说几点问题与建议:

首先,你的第一条提示:

朋友你好,你这个函数没看懂,可以再解释一遍吗

MSXLJX 发表于 2019-10-13 21:43:16
楼主我和你遇到同样的情况,您的问题解决了吗?求教我也是几个函数相乘求积分

风之子儿 发表于 2019-10-28 22:48:08
MSXLJX 发表于 2019-10-13 21:41
朋友你好,你这个函数没看懂,可以再解释一遍吗
  1. function  integralcul          % 这是函数名
  2. integral(@compute,0,pi)    %  这里 @compuete 是指调用compute这个子函数,[0,pi]指自变量x的区间
  3. function f=compute(x)    % 子函数的命名,函数内可以嵌套命名的新函数。
  4. y = x.^2;  %  这里x的二次方,有个点是由于x是个矩阵,而函数本身是一一映射,加点就可以对矩阵的每个元素取平方
  5. z=sin(x);   %
  6. f=y.*z;      % 这里的点乘也是和上面一个意思
复制代码


好久之前的帖子了,也不知道有没有有没有回答清楚。祝好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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