注册 登录
编程论坛 Matlab

多用用符号求解

abingchem 发布于 2006-07-04 11:30, 1088 次点击
符号可以求出精确解:
>> 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

求解小问题的时候,多用符号方法,可能会有意想不到的效果哟
9 回复
#2
zhangenter2006-07-04 13:26
符号精确解小陷阱
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个结果,还是要晕一下
#3
abingchem2006-07-04 18:49
第一段程序如果改成这样:
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,
我不知道是不是这样的情况,在编程中,很麻烦的一件事就是浮点数和零的比较,很多时候,是比较误差的,只要在认可的范围内,浮点数足够小就当成零了。
#4
zhangenter2006-07-04 19:14
应该不是误差的关系,虽然
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的成立是个误导
#5
abingchem2006-07-04 20:02
即使在符号数,在电脑里也是离散化的,也是字节,不可能保证像数学上那样
#6
zhangenter2006-07-04 20:52
我的意思是说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




#7
abingchem2006-07-04 23:22
虚数和实数是不能比较的,何必较这个真呢?如果我是编matlab的,我可以取两个数的实部进行大小比较,一样可以给个结果

至于你说的那个比较,我觉得可能会是这样的:==进行了对符号运算的扩展,而<则没有,就像C++中的运算符重载一样
这是软件本身语法方面的问题
#8
zhangenter2006-07-05 00:07
以下是引用abingchem在2006-7-4 23:22:34的发言:
……
这是软件本身语法方面的问题

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

#9
abingchem2006-07-05 21:24
偶没觉得是对着偶来的啊
#10
luohourao62006-07-09 15:51
谢谢楼主!真的不错啊!
1