1.线性方程组
1 syms x y%中间不可以是分号 2 [x y] = solve(x+y-1,x-y)%若不加前面的变量则得不到结果,不知为何
后来我发现我们更倾向于[x y] = solve('x+y=1','x - y=0')
2.同余方程组
1 sysm n 2 [n] = solve(rem(n,9)-8) 3 %不论怎么改动都没有结果
3.
(A-λE)x=0 其中E为单位矩阵
这是n个未知数n个方程的齐次线性方程组,它有非零解的充要条件是系数行列式为0,
即 |A-λE|=0
带入具体的数字或者符号,可以看出该式是以λ为未知数的一元n次方程,称为方阵A
的特征方程,左端 |A-λE|是λ的n次多项式,也称为方阵A的特征多项式。
1 %poly生成特征多项式,大多时用eig 2 %求解高次多项式,直接roots(系数)
4.cite from:http://bbs.seu.edu.cn/pc/pccon.php?id=950&nid=14498&tid=0
最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,
MATLAB中有两种方法: (1)x=inv(A)*b — 采用求逆运算解方程组;
(2)x=A\b — 采用左除运算解方程组。
例: x1+2x2=8 2x1+3x2=13
>>A=[1,2;2,3];b=[8;13];
>>x=inv(A)*b x = 2.00 3.00
>>x=A\b x = 2.00 3.00;
即二元一次方程组的解x1和x2分别是2和3。
对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.
具体步骤如下:
第一步:定义变量syms x y z ...;
第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN');
第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。
如:解二(多)元二(高)次方程组: x^2+3*y+1=0 y^2+4*x+1=0
解法如下: >>syms x y;
>>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0');
>>x=vpa(x,4);(我在matlab里试了试貌似没有效果,仍然是32位有效数字)
>>y=vpa(y,4);
结果是: x = 1.635+3.029*i 1.635-3.029*i -.283 -2.987 y = 1.834-3.301*i 1.834+3.301*i -.3600 -3.307。
二元二次方程组,共4个实数根;
还有的同学问,如何用matlab解高次方程组(非符号方程组)?
举个例子好吗? 解答如下: 基本方法是:solve(s1,s2,…,sn,v1,v2,…,vn),即求表达式s1,s2,…,sn组成的方程组,
求解变量分别v1,v2,…,vn。
具体例子如下: x^2 + x*y + y = 3 x^2 - 4*x + 3 = 0
解法: >> [x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0')
运行结果为 x = 1 3
y = 1 -3/2
即x等于1和3;y等于1和-1.5
或 >>[x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3= 0','x','y')
x = 1 3
y = 1 -3/2
结果一样,二元二方程都是4个实根。
5.单变量非线性方程求解
z=fzero('fname',x0,tol,trace)
其中fname是待求根的函数文件名,x0为搜索的起点。一个函数可能有多个根,但fzero函数只给出离x0最近的那个根。tol控制结果的相对精度,缺省时取tol=eps,trace指定迭
代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0。
例 求f(x)=3*x-10^x+2=0在x0=0.5附近的根
1 %建议function函数 2 function fx = fun( x ) 3 %UNTITLED Summary of this function goes here 4 % Detailed explanation goes here 5 fx = 3*x - 10.^x +5; 6 7 8 end 9 %注意:建立保存后,指令窗口显示,但貌似不影响下面的使用 10 %??? Input argument "x" is undefined. 11 12 %Error in ==> fun at 4 13 %fx = 3*x - 10.^x +5; 14 15 %在指令窗口调用 16 >> z = fzero('fun',0.5) 17 18 z = 19 20 0.8837
6.非线性方程组的求解(cite from:http://blog.sina.com.cn/s/blog_56ef652d0100ebew.html)
对于非线性方程组F(X)=0,用fsolve函数求其数值解。
fsolve函数的调用格式为X=fsolve('fun',X0,option) 其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供 了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数
来完成。
例 如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。 optimset(‘Display’,‘off’)将设定Display选项为‘off’。
例 求下列非线性方程组在(0.5,0.5) 附近的数值解。
1 function fx = fun( p ) 2 %UNTITLED Summary of this function goes here 3 % Detailed explanation goes here 4 x = p(1); 5 y = p(2); 6 fx(1) = x-0.6*sin(x)-0.3*cos(y); 7 fx(2) = y-0.6*cos(x)+0.3*sin(y); 8 9 10 end 11 12 13 14 15 16 >> x = fsolve('fun',[0.5 0.5]') 17 18 Equation solved. 19 20 fsolve completed because the vector of function values is near zero 21 as measured by the default value of the function tolerance, and 22 the problem appears regular as measured by the gradient. 23 24 <stopping criteria details> 25 26 27 x = 28 29 0.6354 30 0.3734
注意:x = [1 2 3]和x = [1,2,3]是一样的都是行向量
写得有些乱,不过也从侧面反映出我思考了这个问题,但由于见识有限,还望大神不吝赐教。