24小时热门版块排行榜    

查看: 4318  |  回复: 12

星——星

新虫 (初入文坛)

[求助] matlab中已知积分结果,求变量的值

积分函数如图所示,已知函数F的值,如何用matlab求出t的值,还请各位大侠帮帮忙~

matlab中已知积分结果,求变量的值
1852167079.jpg
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖置顶 ( 共有1个 )

yz457694

铁杆木虫 (正式写手)

【答案】应助回帖

星——星: 回帖置顶 2016-08-20 16:14:54
代码没缩进了,重发一下
函数代码:
CODE:
function F=myfun(t)     
  ubound=10000;     
  x=0:0.1:ubound;     
  y=sqrt(x)./(1+exp(x-t));     
  F=trapz(x,y);%梯形积分

求解代码:
CODE:
clear,clc
F=1.4893 ;   %给定的F值
ta=0;tb=100;
fa=F-myfun(ta);
fb=F-myfun(tb); %fa*fb<0即可,不满足的话可以适当放大区间
error=inf;
while error>0.001   %自定义精度     
    tc=(ta+tb)/2;     
    fc=F-myfun(tc);     
    if fa*fc<0         
        tb=tc;     
    else         
        ta=tc;     
    end     
    error=tb-ta;
end
t=(ta+tb)/2;
t

11楼2016-08-20 00:37:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

月只蓝

主管区长 (职业作家)

代入高精度的辛普森积分公式,将原式化成只包含t的代数式,解该代数方程即可。
或者,根据F值,试算t值,可得到t的大概范围,将t范围缩小到足够小,然后将该范围区间等分100份(或者更多),逐个扫描取F值误差左偏差和右偏差最小的两个t值,再以此两者为范围扫描100次,即可获得精度很高的t值。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2016-08-18 22:13:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yz457694

铁杆木虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
如下:
syms x;
F=      ;%给定F的值
myfun=@(t) F-int(sqrt(x)/(1+exp(x-t)),x,0,inf);
t0=     ;%给一个t的初值,最好取接近真实值,收敛会快些
t=eval(fzero(myfun,t0))   %也可以用fsolve
3楼2016-08-18 23:13:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

星——星

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by 月只蓝 at 2016-08-18 22:13:33
代入高精度的辛普森积分公式,将原式化成只包含t的代数式,解该代数方程即可。
或者,根据F值,试算t值,可得到t的大概范围,将t范围缩小到足够小,然后将该范围区间等分100份(或者更多),逐个扫描取F值误差左偏 ...

可以附上相应的代码吗?本人也是最近才开始接触Matlab,对于积分的计算还是第一次,望大侠不吝赐教
4楼2016-08-19 11:46:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

星——星

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by yz457694 at 2016-08-18 23:13:34
如下:
syms x;
F=      ;%给定F的值
myfun=@(t) F-int(sqrt(x)/(1+exp(x-t)),x,0,inf);
t0=     ;%给一个t的初值,最好取接近真实值,收敛会快些
t=eval(fzero(myfun,t0))   %也可以用fsolve

现在无法知道t的真实值是多少,可以随便赋一个初值吗?
5楼2016-08-19 11:51:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yz457694

铁杆木虫 (正式写手)

引用回帖:
5楼: Originally posted by 星——星 at 2016-08-19 11:51:28
现在无法知道t的真实值是多少,可以随便赋一个初值吗?...

可以的,比如1 ,0, -1 均可,解不出来或者结果跟预期有差异的时候再适当调整初值

发自小木虫Android客户端
6楼2016-08-19 12:49:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

星——星

新虫 (初入文坛)

引用回帖:
6楼: Originally posted by yz457694 at 2016-08-19 12:49:44
可以的,比如1 ,0, -1 均可,解不出来或者结果跟预期有差异的时候再适当调整初值
...

嗯嗯,我开始赋的1结果显示:
>> main1
错误使用 fzero (line 309)
起始猜测处的函数值必须为有限实数。

出错 main1 (line 13)
t=eval(fzero(myfun,t0));   %也可以用fsolve

然后赋0时,显示:
>> main1
警告: 没有为 'sym' 输入定义函数。
> In num2str>cellPrintf at 174
  In num2str at 132
  In fzero>disperr at 560
  In fzero at 346
  In main1 at 13
警告: 没有为 'sym' 输入定义函数。
> In num2str>cellPrintf at 174
  In num2str at 133
  In fzero>disperr at 560
  In fzero at 346
  In main1 at 13
正在退出 fzero: 终止搜索包含符号变化的区间
    因为在搜索期间遇到复函数值。
(-0.0282843 处的函数值为 。)
请检查函数或使用其他起始值重试。
未定义与 'double' 类型的输入参数相对应的函数 'eval'。

出错 main1 (line 13)
t=eval(fzero(myfun,t0));   %也可以用fsolve
请问造成上述问题是因为赋的值不合适吗?还是说存在别的问题呢?
7楼2016-08-19 14:27:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yz457694

铁杆木虫 (正式写手)

引用回帖:
7楼: Originally posted by 星——星 at 2016-08-19 14:27:41
嗯嗯,我开始赋的1结果显示:
>> main1
错误使用 fzero (line 309)
起始猜测处的函数值必须为有限实数。

出错 main1 (line 13)
t=eval(fzero(myfun,t0));   %也可以用fsolve

然后赋0时,显示:
& ...

不能乱取的,电脑不在边上,刚用计算器算了一组数据,你可以代进去试试: 取F=1.4893  t0=1
算出来t=1.1左右
应该可以求出来,刚开始我用的一个简单的方程验证了一下代码,能通就直接给你发了,如果还不行,我晚上回去调试下

发自小木虫Android客户端
8楼2016-08-19 15:35:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

星——星

新虫 (初入文坛)

引用回帖:
8楼: Originally posted by yz457694 at 2016-08-19 15:35:35
不能乱取的,电脑不在边上,刚用计算器算了一组数据,你可以代进去试试: 取F=1.4893  t0=1
算出来t=1.1左右
应该可以求出来,刚开始我用的一个简单的方程验证了一下代码,能通就直接给你发了,如果还不行,我晚上回 ...

嗯嗯,我把F=1.4893  t0=1带进去算了,还是显示:
错误使用 fzero (line 309)
起始猜测处的函数值必须为有限实数。

出错 main (line 5)
t=eval(fzero(myfun,t0));   %也可以用fsolve

也无法得出t的值。
9楼2016-08-19 23:04:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yz457694

铁杆木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
星——星: 金币+10, ★★★★★最佳答案, 多谢大侠~ 2016-08-23 19:46:54
不好意思,我想简单了,这种情况下用int积不出来的,只能通过取足够大的上界来近似代替无穷积分(调整上界就可以调整积分精度)。刚看了看,我给你分析一下思路吧(跟二楼差不多)
首先来分析一下F随t的变化趋势,有助于进一步判断
CODE:
for i=1:100     
  t(i)=-50+i;   
  ubound=10000;   %该积分收敛,上界取足够大即可接近无穷积分值     
  x=0:0.1:ubound;     
  y=sqrt(x)./(1+exp(x-t(i)));
  F(i)=trapz(x,y);%梯形积分
end
plot(t,F)

如图1所示,F随t单调增加的。对于给定的F值,就可以试差来确定t的值了。
下面我用二分法(简单便于理解,方法还有很多)来做一下。
定义函数myfun来求F:
CODE:
function F=myfun(t)     ubound=10000;     x=0:0.1:ubound;     y=sqrt(x)./(1+exp(x-t));     F=trapz(x,y);%梯形积分

二分法代码:
CODE:
clear,clc F=   ;   %给定的F值 ta=0;tb=100; fa=F-myfun(ta); fb=F-myfun(tb); %fa*fb<0即可,不满足的话可以适当放大区间 error=inf; while error>0.001   %自定义精度     tc=(ta+tb)/2;     fc=F-myfun(tc);     if fa*fc<0         tb=tc;     else         ta=tc;     end     error=tb-ta; end t=(ta+tb)/2; t

举例:F=1.4893时,结果如图2所示
matlab中已知积分结果,求变量的值-1
图1.png


matlab中已知积分结果,求变量的值-2
图2.png

10楼2016-08-20 00:33:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 星——星 的主题更新
信息提示
请填处理意见