matlab solve命令中解的顺序问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 15:25:14
【x1,x2,x3,....x12】=solve(eq1,eq2,eq3,.......eq12)
其中eq1,eq2,eq3,.......eq12中的未知数就是用x1,x2,x3,....x12表示的。

我用solve命令解这么一个方程,解是解出来了,但答案不大对。仔细观察了一下,发现其实所有的正确解都有,就是顺序不对。本该是x2的值给了x11,本该是x5的值给了x8,本该是x9的值给了x4......

我后来想了想,估计matlab的solve命令里,没有自动对应的功能,也就是说,方程里的x1是未知数,而前面的x1只是用来存放结果的一个变量,而我并不了解solve求解和存放结果的顺序,所以就出了这种错误。

我试着直接用solve(eq1,eq2,eq3,.......eq12)求解,得出的结果是
x1: [24x1 sym]
x2: [24x1 sym]
.....

这么解出来的应该不会有顺序问题了。可是我不会把sym数据转化为double数据。

哪位达人能告诉我solve得到的解的排序规则,或者转化sym数据的方法,不胜感激。

在matlab里面solve命令主要是用来求解代数方程(即多项式)的解,但是也不是说其它方程一个也不能解,不过求解非代数方程的能力相当有限,通常只能给出很特殊的实数解。(该问题给出的方程就是典型的超越方程,非代数方程)

从计算机的编程实现角度讲,如今的任何算法都无法准确的给出任意非代数方程的所有解,但是我们有很多成熟的算法来实现求解在某点附近的解。matlab也不例外,它也只能给出任意非代数方程在某点附近的解,函数有两个:fzero和fsolve,具体用法请用help或doc命令查询吧。如果还是不行,你还可以将问题转化为非线性最优化问题,求解非线性最优化问题的最优解,可以用的命令有:fminbnd, fminsearch, fmincon等等。

x1=1;x2=2;w=3;f=4; %假设它们的值是这些
g=10;
y1=f*g;
y2=-f*g;

k=solve('-y2=(-8)*x2*w^2*(sin(k)+x1/(16*x2))^2+4*x2*w^2+((x1*w)^2)/(32*x2)','k')
k=subs(k)

运行结果:
k =

asin(1/16/x2*(-x1*w+(x1^2*w^2+32*y2*x2+128*x2^2*w^2)^(1/2))/w)
asin(1/16/x2*(-x1*w-(x1^2*w^2+32*y2*x2+128*x2^2*w^2)^(1/2))/w)

k =

0.4569
-0.5279

直接用S=solve(eq1,eq2,eq3,.......eq12)求解,只会得出方程解的‘结构数组’,即S(这种类型很像C语言里面的结构体变量)。例如:
syms x y z
S=solve('y^2-x^2-z^2','y+z-1','x^2-2*x-3','x','y','z')
S.x %求解x