找回密码
 注册
Simdroid-非首页
查看: 115|回复: 12

求助:求解一个带参量的三角函数方程

[复制链接]
发表于 2011-11-11 22:42:37 | 显示全部楼层 |阅读模式 来自 重庆铜梁县
本帖最后由 xiaoyixiao 于 2011-12-25 13:21 编辑

遇到这样一个问题:
我在一个循环语句中求解三角函数方程
tan(x-a)=b*cos(c-x),a,b,c为参数,在求解之前a,b,c均计算出,其中每循环一次将计算出一个a,b,c,我用solve求解出问题
syms A B C
for i=1:1:10
    y=i;
    a(i)=y;
    b(i)=y^2;
    c(i)=y^3;
    d=solve('tan(x-A)=B*cos(C-x)','x');
    e(i)=subs(d,{A,B,C},{a(i),b(i),c(i)});
end

运行后程序就不动了,而且运行很慢,请高手帮忙看看,怎么才能每次循环都能求出e(i)值,谢谢各位了

 楼主| 发表于 2011-11-12 01:54:07 | 显示全部楼层 来自 重庆铜梁县
Simdroid开发平台
自己顶下,希望高手解决下
回复 不支持

使用道具 举报

发表于 2011-11-12 12:04:35 | 显示全部楼层 来自 福建三明
没太明白你的目的,不过    d=solve('tan(x-A)=B*cos(C-x)','x');这一句,明显与循环变量无关,最好放在循环外面,不然的话每一个循环都要解这个方程,程序运行当然慢了。
回复 不支持

使用道具 举报

发表于 2011-11-12 22:40:14 | 显示全部楼层 来自 四川成都
matlab解符号函数速度是比较差的,你的循环表达式里有两个符号表达式,可能是在这里比较费时间。你可以试一下用下面的语句:
>> a=2;
>> b=2^2;
>> c=2^3;
>> e=fzero(@(x) tan(x-a)-b*cos(c-x),0)
能在一定程度上避开符号表达式计算。我试了一下,有解,不过解的精度太差了,这是三角函数自己的特征导致的,可以考虑一下其它求解函数,不一定非要用fzero,再调调搜索步长和tolerance,可能会好点。不过想得到精确解可能有点麻烦,它和初始估值关系太密切了。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-11-13 22:54:19 | 显示全部楼层 来自 重庆铜梁县
messenger 发表于 2011-11-12 12:04
没太明白你的目的,不过    d=solve('tan(x-A)=B*cos(C-x)','x');这一句,明显与循环变量无关,最好放在循 ...

其实是要解这样一个方程tan(x-a)=b*cos(c-x),每循环一次得到一个a,b,c值,再把a,b,c值代入以上方程求解
回复 不支持

使用道具 举报

发表于 2011-11-14 18:18:36 | 显示全部楼层 来自 福建三明
建议你像4#给的方法那样,改为数值求解。如果一定要用符号求解,参考一下下面的贴子可能对你有帮助,http://forum.simwe.com/thread-750041-1-1.html
回复 不支持

使用道具 举报

发表于 2011-11-14 22:15:27 | 显示全部楼层 来自 山东青岛
  1. i=1:10;
  2. s=arrayfun(@(a,b,c)fzero(@(x) tan(x-a)-b*cos(c-x),0),i,i.^2,i.^3)
复制代码
ans =

   -0.5708
    0.4292
    0.3570
   -0.7124
    0.2243
    0.8623
   -1.0895
    0.1460
   -1.4402
   -0.6228

I hope it works! good luck
回复 不支持

使用道具 举报

发表于 2011-11-14 22:23:39 | 显示全部楼层 来自 山东青岛
本帖最后由 liuyalong008 于 2011-11-14 22:26 编辑

PS: Due to the period of function, you may obtain different solutions with different initial values
So, you can start from a series data, such as 0 pi 2pi,etc.
回复 不支持

使用道具 举报

发表于 2011-11-14 22:32:04 | 显示全部楼层 来自 山东青岛
fsolve is also available
  1. i=1:10;
  2. s=arrayfun(@(a,b,c)fsolve(@(x) tan(x-a)-b*cos(c-x),0),i,i.^2,i.^3)
复制代码
1.6662
   -0.1036
    0.3570
   -0.4595
    0.9576
    0.8623
   -1.0895
   -1.6469
   -1.4402
   -0.6228

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-11-15 17:44:50 | 显示全部楼层 来自 重庆铜梁县
谢谢LS各位的解答,明天去试试,希望能解决我的问题
回复 不支持

使用道具 举报

 楼主| 发表于 2011-12-25 09:01:21 | 显示全部楼层 来自 重庆铜梁县
好久没上来,按liuyalong008 方法,问题解决,谢谢各位了
回复 不支持

使用道具 举报

发表于 2011-12-25 11:37:22 | 显示全部楼层 来自 台湾
试用9F的方式, 会有warning
Optimization terminated: first-order optimality is less than options.TolFun.
Optimizer appears to be converging to a minimum that is not a root:
Sum of squares of the function values exceeds the square root of
options.TolFun. Try again with a new starting point.

好奇参考7F的答案试下两初值, 也都没出现7F的答案
  1. i=1; ss2=arrayfun(@(a,b,c)fsolve(@(x) tan(x-a)-b*cos(c-x),-0.57),i,i.^2,i.^3)
  2. i=1; ss2=arrayfun(@(a,b,c)fsolve(@(x) tan(x-a)-b*cos(c-x),-0.58),i,i.^2,i.^3)
复制代码
该如何处理!?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-12-25 13:37:18 | 显示全部楼层 来自 重庆铜梁县
ChaChing 发表于 2011-12-25 11:37
试用9F的方式, 会有warning

好奇参考7F的答案试下两初值, 也都没出现7F的答案该如何处理!? ...

呵呵,刚发现了
用ezplot('y=tan(x-1)-1*cos(1-x)')发现,在-0.5附近没有解 -0.5708。而
i=1; ss2=arrayfun(@(a,b,c)fzero(@(x)tan(x-a)-b*cos(c-x),0),i,i.^2,i.^3)却求出 x=-0.5708
把初值设置在1时,
i=1; ss2=arrayfun(@(a,b,c)fzero(@(x) tan(x-a)-b*cos(c-x),1),i,i.^2,i.^3)
求得ss2 =1.6662
此时与
i=1; ss2=arrayfun(@(a,b,c)fsolve(@(x) tan(x-a)-b*cos(c-x),-0.57),i,i.^2,i.^3)
相同
请问大侠这是怎么回事,fzero并没有求出0附近方程的解
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-3 03:23 , Processed in 0.043026 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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