西点揭秘免费观看:【求助】关于MATLAB解三次方程

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 01:00:24
第一种
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需要不断赋新值,故要采用第一种方法,可是这两种那种计算正确呢。
作者:xiegangmai
带入方程验证一下就知道了,第二种方法计算出来的正确。

建议先用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]})
作者: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的解。
作者:dxyan
还是用虚根形式表达的呀,我的目的是计算出根,提取实根,再比较大小。虽然解值虚根部分是0,但这样是的算是虚根呢还是实根,不论怎样,这种虚根的表达方式(虚根部分是0)没法将实根提取出来。 QUOTE: 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 ...
作者:xiegangmai
你能保证你带入的系数计算出来的解都是实数值吗?
第一列中是你需要的解,虚部为零。

如果只需要实部,用real函数就可以了。
作者: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)
第一种无法提取实根,第二种可以 QUOTE: Originally posted by xiegangmai at 2010-04-23 17:14:14:
你能保证你带入的系数计算出来的解都是实数值吗?
第一列中是你需要的解,虚部为零。

如果只需要实部,用real函数就可以了。
作者:xiegangmai
:D
楼主真有意思。你先用isreal判断计算出的结果是否是实数,再对x中的实数取实数部分?
这样做有什么意思呢?

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