一.符号寻根法(Symbolic Root Finding Approach)
把自变量作为符号来处理,而非作为数来处理,得到的是解析解而非数值解1.创建符号化的变量:
创建符号化的变量:<a> = sym("<x>"[,"<set>","clear"]) #注意:sym('pi') now creates a symbolic variable named pi instead of a symbolic number representing the mathematical constant π #参数说明: set:假设变量属于某集合;可为"real"(实数)/"positive"(正数)/"integer"(整数)/"rational"(有理数) "clear":要求清除设置在变量上的假设,即清除set(不能与set同时使用) <A> = sym("<a>",[<n1> <n2> ... <nM>][,<set>,"clear"]):创建符号化的向量A=[an1,an2...anM] #注意:[<n1> <n2> ... <nM>]整体是1个向量,1个参数!!! #an1,an2...不会出现在Workspace的当前变量中 #多维数组的表示参见官方文档 #参数说明: set:表示所有向量中的元素都属于某集合;可用值同上 "clear":要求清除设置在所有向量中元素上的假设,即清除set(不能与set同时使用) <A> = sym("<a>",<n>):创建1个元素为随机数的符号化的n阶方阵 sym(<num>[,<flag>]):将1个数值/数值矩阵转换为符号化的数值/矩阵 #参数说明: flag:指定如何将浮点数转换为符号化的数值 sym(<strnum>):将字符串/字符向量转换成精确的(避免任何近似)符号化的值 <symexpr> = sym(<h>) #注意:也可以使用syms,参见官方文档 #实例: >> x = sym('x') x = x >> a = sym('a',[1 4]) a = [ a1, a2, a3, a4] >> a = sym('x_%d',[1 4]) a = [ x_1, x_2, x_3, x_4] >> a(1) ans = x_1 >> a(2:3) ans = [ x_2, x_3] >> A = sym('A',[3 4])???创建array和matrix如何区分 A = [ A1_1, A1_2, A1_3, A1_4] [ A2_1, A2_2, A2_3, A2_4] [ A3_1, A3_2, A3_3, A3_4]2.求解符号方程:
求解符号化的方程:Y = solve(eqns,[vars,Name,Value]) #注意:如果无法求出符号解,会返回数值解 #参数说明: eqns:指定1/多个符号化的方程 vars:指定未知数 Name,Value:指定其他参数的参数名和参数值 Y:返回得到的解 #实例: >> x=sym("x"); >> eqn=x^2-x^3+x==0;#可省去"==0" >> solve(eqn) ans = 0 1/2 - 5^(1/2)/2 5^(1/2)/2 + 1/2 >> y=sym("y"); >> eqns=[x+y==33,x^2-y==0]; >> solve(eqns)#也可以把每个方程单独传入 ans = 包含以下字段的 struct: x: [2×1 sym] y: [2×1 sym] >> solve(x+y) ans = -y >> solve(x+3-y==11,[x,y])#不能省去"==11" ans = 包含以下字段的 struct: x: [1×1 sym] y: [1×1 sym] >> a=sym("a"); >> b=sym("b"); >> [m,n]=solve([x+y==b,x-y==a],[x,y]) m = a/2 + b/2 n = b/2 - a/2二.数值求根法(Numeric Root Solvers) 1.方程组:
求方程组的数值解:[x,fval,exitflag,output,jacobian] = fsolve(fun[,x0,options]) #参数说明: fun:用于指定要求解的方程/方程组 #要求解的方程组是:fun(x)=0 x0:指定初始解 options:指定优化选项 x,fval:返回解和fun在解处的值 exitflag,output:返回描述该函数退出条件的值及提供优化过程信息的结构体 jacobian:返回fun在x处的Jacobian矩阵 #实例: >> f=@(x) (3*x^3-3*x^2+2*x+7); >> fsolve(f,0) Equation solved. fsolve completed because the vector of function values is near zero as measured by the default value of the function tolerance, and the problem appears regular as measured by the gradient. <stopping criteria details> ans = -0.9386 #如果将f定义在文件中: #f.mlx中: function y=f(x) y=3*x^3-3*x^2+2*x+7; end #命令行中: >> fsolve(f,0) 输入参数的数目不足。 出错 f (line 2) y=3*x^3-3*x^2+2*x+7; >> fsolve(@f,0)#就需要使用函数句柄的格式 Equation solved. fsolve completed because the vector of function values is near zero as measured by the default value of the function tolerance, and the problem appears regular as measured by the gradient. <stopping criteria details> ans = -0.93862.方程:
求方程的数值解:[x,fval,exitflag,output] = fzero(fun,x0[,options]) #注意:只会返回据x0最近的解;fzero()要求在零点处变号,否则解不出来,fsolve()没有该限制 #实例: >> fun=@(x) x^2; >> fzero(fun,1) 正在退出 fzero: 将终止搜索包含符号变化的区间 因为在搜索期间遇到 NaN 或 Inf 函数值。 (-1.7162e+154 处的函数值为 Inf。) 请检查函数或使用其他起始值重试。 ans = NaN >> fun=@(x) x^2-1; >> fzero(fun,2) ans = 13.多项式:
求多项式方程的数值解:r = roots(p) #参数说明: p:指定多项式的系数(越靠后的项对应的次数越低);为vector #要求解的方程为p[0]*x^n + ... + p[n-1]*x + p[n] r:返回解 #实例: >> roots([1,0,0]) ans = 0 0 >> roots([3,2,1]) ans = -0.3333 + 0.4714i -0.3333 - 0.4714i