star19831106 发表于 2011-5-25 22:18:15

求助:solve函数求解方程

本帖最后由 star19831106 于 2011-5-26 16:51 编辑


已知:
k1=-1.1;k2=8.72;k3=34.272;k4=26.7328; xp>-2
求解方程
k1*ts+1/2*k2*ts^2+1/6*k3*ts^3+1/24*k4*ts^4=xp
我首先将xp离散成若干值
比如
xp=-2:5;
或者
xp=-1:4;
然后编制如下程序进行计算


clc;clear;
xp=-1:1:3;%xp的值大于-2就可以
np=length(xp);
%-----------
k1=-1.1;k2=8.72;k3=34.272;k4=26.7328;
%------------
syms ts;
%------------
kts=k1*ts+1/2*k2*ts^2+1/6*k3*ts^3+1/24*k4*ts^4;
Dkts=diff(kts,ts);
%------------
for i=1:np
    fts=Dkts-xp(i);
    t0=double(eval(solve(fts,ts)))
end


但是无论xp的值取为:

xp=-2:5;
还是
xp=-1:4;
或者其他的值
解出来的第一个t0值都是复数值(其实应该是实数值)


请问为什么无论xp如何取值解出来的第一个t0值都会是复数呢?
是程序编错了吗?


谢谢!!

nwcwww 发表于 2011-5-25 23:53:17

本帖最后由 nwcwww 于 2011-5-25 23:57 编辑

在MATLAB MUPAD里算出来三个实根:



直接在命令行里也一样:
syms t;
f=(8354*t^3)/1875 + (2142*t^2)/125 + (218*t)/25 + 9/10;
s=solve(f,t);
double(s)


ans =

   -0.1407
   -3.2657
   -0.4397

star19831106 发表于 2011-5-26 07:59:22

十分感谢您的帮助。
我复制了一下您的代码
结果是
ans =
-0.1407         
-3.2657 - 0.0000i
-0.4397 + 0.0000i
虽然3个都是实数解,但是后两个却表现为虚部为零的复数。
用isreal()函数识别不出来。继续请教这是什么原因。谢谢!

qibbxxt 发表于 2011-5-26 08:42:13

分别判断请用isreal和arrayfun函数

star19831106 发表于 2011-5-26 09:59:09

继续求助,请高手帮忙分析。
谢谢!!

messenger 发表于 2011-5-26 10:31:22

应该是计算精度的问题吧,你就用下面这三个解吧
ans =

   -0.1407
   -3.2657
   -0.4397

star19831106 发表于 2011-5-26 13:20:34

谢谢qibbxxt 斑竹和messenger总斑竹 的帮助。
我是要求一组方程的解
不是单单要求一个方程的解

我遇到的问题是一楼的代码中
第一个方程的解总是复数

取xp=-1:1:3时,第一个方程的解为复数,其余为实数
取xp=-2:1:3时,也是第一个方程的解为复数,其余为实数。

不知道是什么原因。
谢谢!
页: [1]
查看完整版本: 求助:solve函数求解方程