| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1074 人关注过本帖
标题:多用用符号求解
只看楼主 加入收藏
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
 问题点数:0 回复次数:9 
多用用符号求解
符号可以求出精确解:
>> solve('sin(x)=cos(x)')

ans =

1/4*pi

>> f2=solve('tan(2*x)=sin(x)')

f2 =

[ 0]
[ pi]
[ atan(1/2*(-2*3^(1/2))^(1/2),1/2+1/2*3^(1/2))]
[ atan(-1/2*(-2*3^(1/2))^(1/2),1/2+1/2*3^(1/2))]
[ atan(1/2*2^(1/2)*3^(1/4)/(1/2-1/2*3^(1/2)))+pi]
[ -atan(1/2*2^(1/2)*3^(1/4)/(1/2-1/2*3^(1/2)))-pi]

>> [x,y,z]=solve('x+y+z=1','x-y+z=2','2*x-y-z=1')

x =

2/3


y =

-1/2


z =

5/6

求解小问题的时候,多用符号方法,可能会有意想不到的效果哟
搜索更多相关主题的帖子: 符号 求解 
2006-07-04 11:30
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
符号精确解小陷阱
clear
a=solve('3*x=1');
if a==1/3
disp('equal!');
elseif a-1/3==0
disp('equal or not equal');
else disp('not equal!');
end
运行结果:
equal!

换个:
clear;
b=solve('3*x=i');
if b==1/3*i
disp('equal!');
elseif b-1/4*pi==0
disp('equal or not equal?');
else disp('not equal!');
end
结果:
not equal!

再来:
clear;
c=solve('sin(x)=1');
if c==1/2*pi
disp('equal!');
elseif c-1/2*pi==0
disp('equal or not equal?');
else disp('not equal');
end
结果:
equal or not equal?

到底精确解精确不精确哦。


当然,这倒不是精度问题,因为三个解a,b,c是符号类型的,
如果用的是eval(a)==1/3;eval(b)==1/3*i;eval(c)==1/2*pi的话,3个结果都是equal
但3种情况能得到3个结果,还是要晕一下

OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2006-07-04 13:26
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
第一段程序如果改成这样:
a=solve('3*x=1');
if a==1/3
disp('equal or not equal');
elseif a-1/3==0
disp('equal!');
else disp('not equal!');
end
结果就是:
equal or not equal
可见a=1/3

对第二段,你可以加一个syms i;变成:
syms i;
b=solve('3*x=i');
if b==1/3*i
。。。。。。
试试,结果意想不到哟:)

而事实上,在运行环境里a-1/2=b-1/3*pi=c-1/2*pi=0,
我不知道是不是这样的情况,在编程中,很麻烦的一件事就是浮点数和零的比较,很多时候,是比较误差的,只要在认可的范围内,浮点数足够小就当成零了。

此人已消失
2006-07-04 18:49
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
应该不是误差的关系,虽然
solve('x=1')==1和solve('x=1')-1==0都成立
但是solve('x=1')>0或者solve('x=1')<2却并不能运算
换句话说,一个是符号数,一个是常数,根本没有可比较性,何来的比较误差呢
个人认为,solve('x=1')==1和solve('x=1')-1==0的成立是个误导

OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2006-07-04 19:14
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
即使在符号数,在电脑里也是离散化的,也是字节,不可能保证像数学上那样

此人已消失
2006-07-04 20:02
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
我的意思是说a=slove('x=1')的结果,a=1,这个a是sym类型的
而直接赋值 b=1,这个b就是double类型的。
如果用不等号来比较a<=b或是a>=b,软件会提示错误信息
但是如果用恒等号a==b的话,却能得到结果1。
那么,这两个数到底能不能比较,如果能,为什么有错误信息,如果不能,恒等号成立作何解释。

再说说虚数和实数的比较
i<1 ========> 1
i>-1 ========> 1
这能说明在matlab里虚数可以和实数比较大小了吧。
i<0 ========> 0
i>0 ========> 0
难道说在matlab里i和0相等?
i==0 ========> 0





OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2006-07-04 20:52
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
虚数和实数是不能比较的,何必较这个真呢?如果我是编matlab的,我可以取两个数的实部进行大小比较,一样可以给个结果

至于你说的那个比较,我觉得可能会是这样的:==进行了对符号运算的扩展,而<则没有,就像C++中的运算符重载一样
这是软件本身语法方面的问题

此人已消失
2006-07-04 23:22
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
以下是引用abingchem在2006-7-4 23:22:34的发言:
……
这是软件本身语法方面的问题

我也是在说软件语言方面有点问题,不是冲着你去的


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2006-07-05 00:07
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
偶没觉得是对着偶来的啊

此人已消失
2006-07-05 21:24
luohourao6
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-5-22
收藏
得分:0 
谢谢楼主!真的不错啊!
2006-07-09 15:51
快速回复:多用用符号求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033592 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved