查看: 4505|回复: 7|关注: 0

[已解决] 无法用integral搭配fzero求解无法显式表达的函数的定积分,help

[复制链接]

新手

26 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
  • 关注者: 3
大家好,小弟在寫一段程式碼,可是沒辦法自己debug,求大神建議

n = 100; Cpk_hat = 1.5; r = 0.95; zzz = 1.00;
fun = @(t,C)chi2cdf(((n-1)*((3*C+abs(zzz)*sqrt(n))-t).^2/(9*n*Cpk_hat.^2)),n-1)*...
    (normpdf(t+zzz*sqrt(n))+normpdf(t-zzz*sqrt(n)));
C_guess = 1;
fzero(@(C) integral(@(t) fun(t,C),0,((3*C+abs(zzz))*sqrt(n)))-(1-r),C_guess);

錯誤訊息:
Error using fzero (line 306)
FZERO cannot continue because user-supplied function_handle ==>
@(C)integral(@(t)fun(t,C),0,((3*C+abs(strange_hat))*sqrt(n)))-(1-r) failed with the error
below.


Inner matrix dimensions must agree.


希望版上的高手給點意見,實在不知道哪邊錯了,謝謝!

回复主题 已获打赏: 0 积分

举报

论坛优秀回答者

24

主题

1万

帖子

1639

最佳答案
  • 关注者: 991
发表于 2017-8-25 23:41:20 | 显示全部楼层 |此回复为最佳答案
integral 函数要求被积函数支持 array operators,所以,*  ^  / 应该用 .*  .^  ./ 代替。help文档说的很清楚:
For scalar-valued problems, the function y = fun(x) must accept a vector argument, x, and return a vector result, y. This generally means that fun must use array operators instead of matrix operators.

你这里仅需修改一处:
fun = @(t,C)chi2cdf(((n-1)*((3*C+abs(zzz)*sqrt(n))-t).^2/(9*n*Cpk_hat.^2)),n-1).*...
    (normpdf(t+zzz*sqrt(n))+normpdf(t-zzz*sqrt(n)));
回复此楼 已获打赏: 0 积分

举报

新手

26 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
  • 关注者: 3
 楼主| 发表于 2017-8-26 10:06:15 | 显示全部楼层
winner245 发表于 2017-8-25 23:41
integral 函数要求被积函数支持 array operators,所以,*  ^  / 应该用 .*  .^  ./ 代替。help文档说的很 ...

原來是這樣,太謝謝你了!
回复此楼 已获打赏: 0 积分

举报

新手

26 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
  • 关注者: 3
 楼主| 发表于 2017-8-26 11:14:55 | 显示全部楼层
winner245 发表于 2017-8-25 23:41
integral 函数要求被积函数支持 array operators,所以,*  ^  / 应该用 .*  .^  ./ 代替。help文档说的很 ...

你好,
那請問像chi2cdf內的(n-1)*((3*C+abs(zzz)*sqrt(n))  不需要用 (n-1).*((3.*C+abs(zzz).*sqrt(n)) 處理嗎?
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

权威

9190 麦片

财富积分



11

主题

1万

帖子

1996

最佳答案
  • 关注者: 590
发表于 2017-8-26 11:38:29 | 显示全部楼层
本帖最后由 jingzhaos 于 2017-8-26 16:34 编辑
劉柳柳 发表于 2017-8-26 11:14
你好,
那請問像chi2cdf內的(n-1)*((3*C+abs(zzz)*sqrt(n))  不需要用 (n-1).*((3.*C+abs(zzz).*sqrt(n)) ...

与标量相乘的都不需要点乘。你的n、C、zzz都是标量,故不需要,当然你点乘也没有问题。
回复此楼 已获打赏: 0 积分

举报

新手

26 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
  • 关注者: 3
 楼主| 发表于 2017-8-26 12:22:26 | 显示全部楼层
本帖最后由 劉柳柳 于 2017-8-26 12:24 编辑
jingzhaos 发表于 2017-8-26 11:38
功能标量相乘的都不需要点乘。你的n、C、zzz都是标量,故不需要,当然你点乘也没有问题。 ...

你好,想再請教你一個row vector弄成矩陣的的問題:
我寫了一個迴圈,讓a變成一個1-by-468的row vector,
a = [];
for Cpk_hat = 0.7:0.1:1.8
    for n = 10:5:200
        r = 0.95;
        LCB = get_LCB_of_Cpk(Cpk_hat,n,r);
        a = [a LCB];
    end
end

可是我想要弄成一個39-by-12的矩陣,本來想用迴圈處理,但行不通,可以請你給點建議嗎? 謝謝!
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

权威

9190 麦片

财富积分



11

主题

1万

帖子

1996

最佳答案
  • 关注者: 590
发表于 2017-8-26 16:33:15 | 显示全部楼层
劉柳柳 发表于 2017-8-26 12:22
你好,想再請教你一個row vector弄成矩陣的的問題:
我寫了一個迴圈,讓a變成一個1-by-468的row vector,
a ...

你有两个办法。第一种
  1. Cpk_hat = 0.7:0.1:1.8;
  2. n=10:5:200;
  3. a(numel(Cpk_hat),numel(n))=0;
  4. for k=1:numel(Cpk_hat)
  5.     for m = 1:numel(n)
  6.         r = 0.95;
  7.         LCB = rand(1);
  8.         a(m,k) = get_LCB_of_Cpk(Cpk_hat(k),n(m),r)
  9.     end
  10. end
复制代码

第二种,直接在循环后面加一句:a=reshape(a,39,[]),不知道哪一种更符合你的需要
回复此楼 已获打赏: 0 积分

举报

新手

26 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
  • 关注者: 3
 楼主| 发表于 2017-8-26 19:19:56 | 显示全部楼层
jingzhaos 发表于 2017-8-26 16:33
你有两个办法。第一种
第二种,直接在循环后面加一句:a=reshape(a,39,[]),不知道哪一种更符合你的需要 ...

了解了 ,謝謝你的分享,我選用第二種!
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表