24小时热门版块排行榜    

查看: 1204  |  回复: 7

dxyan

木虫 (正式写手)

[交流] 【求助】关于MATLAB解三次方程 已有3人参与

第一种
syms z
a=0.013583
b=0.0010855
f=z^3-z^2+z*(a-b-b^2)-a*b
s=solve(f,'z')
x=vpa(s,6)
第二种
f=sym('z^3-z^2+z*(0.013583-0.0010855-0.0010855^2)-0.013583*0.0010855=0')
s=solve(f,'z')
d=vpa(s,6)

这两种:第一种解下下来是三个虚根,第二种是三个实根,而且虚根的实部是和实根一样的?为什么呢?因为程序a,b需要不断赋新值,故要采用第一种方法,可是这两种那种计算正确呢。
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主


anyuezhiji(金币+1):欢迎应助 2010-04-23 14:54
带入方程验证一下就知道了,第二种方法计算出来的正确。

建议先用solve求解出来,然后用subs替换a、b,得到结果
给个简单的例子

syms a b x;
s = solve('x^3-x^2+x*(a-b-b^2)-a*b=0');
result = subs(s,{a,b},{[0.013583,1,2,3],[0.0010855,3,2,1]})
明德厚学、求是创新
2楼2010-04-23 14:53:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主

求解结果是

result =

   0.9874 - 0.0000i   3.9651 + 0.0000i   2.8751             1.5747         
   0.0113 + 0.0000i  -0.2820 - 0.0000i  -0.9376 - 0.7157i  -0.2874 - 1.3500i
   0.0013 - 0.0000i  -2.6831 + 0.0000i  -0.9376 + 0.7157i  -0.2874 + 1.3500i
每一列对应为一个系数a和b的解。
明德厚学、求是创新
3楼2010-04-23 14:54:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dxyan

木虫 (正式写手)

还是用虚根形式表达的呀,我的目的是计算出根,提取实根,再比较大小。虽然解值虚根部分是0,但这样是的算是虚根呢还是实根,不论怎样,这种虚根的表达方式(虚根部分是0)没法将实根提取出来。
引用回帖:
Originally posted by xiegangmai at 2010-04-23 14:54:31:
求解结果是

result =

   0.9874 - 0.0000i   3.9651 + 0.0000i   2.8751             1.5747         
   0.0113 + 0.0000i  -0.2820 - 0.0000i  -0.9376 - 0.7157i  -0.2874 - 1.3500i
   0.0013 - 0.0 ...

4楼2010-04-23 15:46:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主

★ ★
dxyan(金币+5): 2010-04-23 19:36
adu886886(金币+2):谢谢提供意见 2010-04-24 11:09
你能保证你带入的系数计算出来的解都是实数值吗?
第一列中是你需要的解,虚部为零。

如果只需要实部,用real函数就可以了。
明德厚学、求是创新
5楼2010-04-23 17:14:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dxyan

木虫 (正式写手)

不能保证方程解出的根都是实根,所以求出实根后,用如下程序提取实根

提取实根比较
第一种
syms z
a=0.013583
b=0.0010855
f=z^3-z^2+z*(a-b-b^2)-a*b
x=solve(f,'z')
x=double(x)
for k=1:length(x)
    y(k) = isreal(x(k));
end
X_real=x(y)

第二种
f=sym('z^3-z^2+z*(0.013583-0.0010855-0.0010855^2)-0.013583*0.0010855=0')
s=solve(f,'z')
x=double(s)
for k=1:length(x)
    y(k) = isreal(x(k));
end
X_real=x(y)
第一种无法提取实根,第二种可以
引用回帖:
Originally posted by xiegangmai at 2010-04-23 17:14:14:
你能保证你带入的系数计算出来的解都是实数值吗?
第一列中是你需要的解,虚部为零。

如果只需要实部,用real函数就可以了。

6楼2010-04-23 19:35:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiegangmai

版主 (职业作家)

我没头衔

优秀版主优秀版主优秀版主


anyuezhiji(金币+1):谢谢提供意见 2010-04-24 20:34
dxyan(金币+5): 2010-04-27 11:40

楼主真有意思。你先用isreal判断计算出的结果是否是实数,再对x中的实数取实数部分?
这样做有什么意思呢?

用isreal得到的y(k)是个逻辑数组,能用作x中元素的引用吗?

[ Last edited by xiegangmai on 2010-4-24 at 17:21 ]
明德厚学、求是创新
7楼2010-04-24 17:19:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ytudou

银虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
7楼: Originally posted by xiegangmai at 2010-04-24 17:19:25

楼主真有意思。你先用isreal判断计算出的结果是否是实数,再对x中的实数取实数部分?
这样做有什么意思呢?

用isreal得到的y(k)是个逻辑数组,能用作x中元素的引用吗?
...

请教一下,matlab能计算二元高次方程吗?如何计算呢?
要给力啊,MS~LAMMPS~
8楼2013-10-11 10:23:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dxyan 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见