《微分和差分方程讲解》由会员分享,可在线阅读,更多相关《微分和差分方程讲解(27页珍藏版)》请在金锄头文库上搜索。
1、2014届合肥工业大学数学建模培训资料Part 6微分和差分方程这次教程有点多,望大家耐心看哦!第一章 几类方程求解1.1 代数方程求解下面主要介绍几类常用的方程求根方法。(1)多项式roots调用示例: r = roots(p)其中,p为多项式的系数,从高次到低次顺序,r为对应的多个根。如多项式:,求解程序如下: p = 1 -6 -72 -27; r = roots(p)r = 12.1229 -5.7345 -0.3884注意:通过其它函数也可以多项式的根,但是不能求出所有的根,而roots可以求出多项式所有的根。下面将会看到。参考函数:poly, residue (2)一元函数fzer
2、o调用示例: x = fzero(fun,x0) x = fzero(fun,x0,options) x,fval = fzero(.)其中,fun为待求函数的名称,x0为初始值,x为解,fval为最优解对应的值(对于求根来说,理想情况下为0)。如: ,求根程序如下: f = (x)x.3-2*x-5; z = fzero(f,2)再看看(1)中的示例,程序 f = (x)x.3-6*x.2-72*x-27; z1 = fzero(f,10) z2 = fzero(f,-4) z3 = fzero(f,0)很容易发现,对于不同的初始值,最后的根也不一样,最后的结果分别为:12.1229、-5.
3、7345、-0.3884,而这三个分别为(1)中roots得到的解。实际上fzero函数的实现方式是以某个初始点来迭代得到方程解的,因为初始值的选取对最终结果影响很大。下面说到的牛顿迭代之类的算法也是类似情况,对初始值的选取很敏感,而智能算法对初始值的选取并不敏感。注意:f = (x).是匿名函数的表达方式,即该函数没有名字,但是通过来指定变量,或者待求变量。参考函数:fminbnd, optimset, function_handle (), Anonymous Functions小技巧:快捷注释与注释消除键,选取待注释语句,然后ctrl+R为注释,ctrl+T为消除注释。 (3)非线性方程
4、组fsolve调用示例: x = fsolve(fun,x0) x = fsolve(fun,x0,options) x,fval = fsolve(fun,x0)其中,fun为函数名,x0为初始值,options为参数设置(迭代算法、步长、精度等),x为最优解,fval为最优解对应的最优值。示例如下:x0 = -5; -5; % 随机初始值options=optimset(Display,iter); % 显示每次迭代的过程x,fval = fsolve(myfun,x0,options) % 调用优化函数其中,myfun如下:function F = myfun(x)F = 2*x(1)
5、- x(2) - exp(-x(1); -x(1) + 2*x(2) - exp(-x(2); 迭代过程:最后的解为:x = 0.5671 0.5671fval = 1.0e-006 * -0.4059 -0.4059注意:该函数求解性能很强,大家可以随意设置初始值x0看看结果如何,理论上结果是不变的,也就是该函数使用的迭代算法对初始值不敏感。 (4)符号方程solve调用示例: solve(eq) solve(eq,var) solve(eq1,eq2,.,eqn) g = solve(eq1,eq2,.,eqn,var1,var2,.,varn)其中,eq为待求解的符号方程,默认的求解符号
6、是x;通过var设置带求解的符号变量;求解符号方程组的话,需要依次添加每个方程,以及带求解的所有符号变量。g是存放结果的结构体变量,通过g.x调用显示结果。示例如下:% 求解 a*x2 + b*x + c = 0 关于x的符号解solve(a*x2 + b*x + c)% 求解 a*x2 + b*x + c = 0 关于b的符号解solve(a*x2 + b*x + c,b)% 求解方程组 x + y = 1,x - 11*y = 5 的所有符号解S = solve(x + y = 1,x - 11*y = 5);S.x, S.y% 求解方程组 a*u2 + v2,u - v = 1, a2
7、- 5*a + 6 = 0 的所有符号解A = solve(a*u2 + v2, u - v = 1, a2 - 5*a + 6)A.a, A.u, A.v结果就不写出来了,大家测试下就好了。 注意:像这样a*x2 + b*x + c的写法代表方程a*x2 + b*x + c = 0,所以u - v = 1也可以写成u - v - 1哦,不妨测试下。 (5)牛顿迭代法解非线性方程牛顿迭代算法原理比较简单,大家可以参考Lagrange定理推导。求解示例如下:% 使用默认精度1e-6x=newton(myfun,1;2, 10)% 设置精度x=newton(myfun,1;2, 50, 0.000
8、0001)其中newton函数如下:function x = newton(funname, x0, Maxgen, tol)% 作用: 通过牛顿迭代算法求解非线性方程组% 调用方式: x = newton(f_name,x0)% x = newton(f_name,x0,tol)% x: 最优解% funname: 定义方程组的函数名% x0: 初始值% Maxgen: 最大迭代次数% tol: 精度(默认:1e-6) h = 0.0001;M = Maxgen; % 最大迭代次数if nargin tol xb = x; if n M break; end y = feval(funnam
9、e, x); fprintf( n=%3.0f, x=%12.5e, y=%12.5e, n,n,x,y) y_driv = (feval(funname,x+h)-y)/h; x = xb-y./y_driv; n= n+1;endfprintf( n=%3.0f, x=%12.5e, y=%12.5e, ,n,x,y)if n M fprintf(n); disp(Warning: iterations exceeds the limitation, probable devergent);end 注意:通过调节最大迭代次数很容易发现,一般在10次左右就可以达到最优解,或者近似最优解;而通
10、过加大迭代次数或者精度也很难获取更有解。因而牛顿迭代可以通过很少的迭代次数获取较优解。 (6)遗传算法这里讨论的遗传算法是基于matlab自带工具箱的,后面讲详细介绍GA算法的实现过程。工具箱调用示例:x = ga(fitnessfcn,nvars)x = ga(fitnessfcn,nvars,A,b)x = ga(fitnessfcn,nvars,A,b,Aeq,beq)x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB)x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon)x = ga(fitnessfcn,n
11、vars,A,b,Aeq,beq,LB,UB,nonlcon,options)x = ga(problem)x,fval = ga(.)x,fval,exitflag = ga(.) 其中,fitnessfcn是自适应函数或者目标函数;nvars是带求解变量的个数;A和b分别是线性不等约束条件的矩阵系数A和向量b;Aeq和beq分别是线性等式约束条件的矩阵系数Aeq和向量beq;LB和UB分别为nvars个带求解变量的上下限向量。注意:这里面的向量都是列向量哦!其他参数可以参考matlab的help。 应用举例:目标函数:约束条件:求解程序:% 线性非等式约束A = 1 1; -1 2; 2
12、1; b = 2; 2; 3;% 变量下限lb = zeros(2,1);% 调用工具箱x,fval,exitflag = ga(gatestfun,2,A,b,lb) 其中,gatestfun如下:function y = gatestfun(x)p1=0.5;p2=6.0;y = p1*x(1)2 + x(2)2 -x(1)*x(2) -2*x(1) - p2*x(2); 结果如下:x = 0.6670 1.3340fval = -8.2258exitflag = 1 注意:exitflag 是算法终止标志,1代表正常终止,其它参考help。这里的函数参数传递是通过gatestfun匿名方
13、式的,而上面我们编写的newton是通过myfun字符串方式传递的。ga工具箱求解的是函数的最小值。 (7)黄金分割法和插值法单变量调用示例:x = fminbnd(fun,x1,x2)x = fminbnd(fun,x1,x2,options)x,fval = fminbnd(.)x,fval,exitflag = fminbnd(.)x,fval,exitflag,output = fminbnd(.) 其中,fun是待求解方程的名称,x1和x2分别为最优解的上下限,options和前面一样参数配置,其他参数类似。应用举例:求解方程在区间(0,2)上面的最小值,程序如下:% 带求解函数的匿名表达f = (x)x.3-2*x-5;% 调用函