0. 引言 一些非线性方程在实数范围内存在多解,本帖要讨论的正是求得所有的这些解的方法。多解方程,其解的个数不同,求解难度也不同,本帖将针对解个数较少和解个数较多的两种情况,各举一例进行讨论,并提出相应的方法和代码,作者希望本帖提出的方法和代码能具有较强的普适性。 本帖所采用软件及其版本: (1)1stOpt 1.5 (2)MATLAB 2010a (3)Maple 18 1. 解个数较少的情况 例:求出如附图1所示方程的全部解(方程出处:http://muchong.com/bbs/viewthread.php?tid=9911763&fpage=1)。 具体步骤如下: 步骤1:画出方程图形,直观上确定解的个数 为了画出方程图形,首先须正确输入该方程,如果输入的原始方程都是错误的,就更不用谈结果的正确性。 因此,在步骤1中还包括一个方程输入预检验的步骤。 步骤1.1:方程输入预检验 根据附图1,可将原始方程写为: y=(25-(3/25)*k)^2-9.8*k*tanh((1/10)*k)*(1+(0.125e-2*(8+cosh(.4*k)-2*tanh(.1*k)^2))/sinh(.1*k)^4) 由于待求解方程形式较为复杂,须检查方程的输入是否正确。这里用到的软件是Maple,利用该软件强大的二维显示功能,可判断方程输入的正误。 将上述方程在Maple中的显示结果如附图2所示。 仔细比对可知,原方程输入无误。 步骤1.2:方程图形绘制 绘制原方程的图形曲线时,横轴坐标的范围尽量大一些;同时绘制出直线y=0,该直线与原方程曲线的交点,即为方程的解。 对于本例,MATLAB代码如下:CODE:
clear all;clc
n=5000; k=linspace(-1000,5000,n); y=(25-(3/25)*k).^2-9.8*k.*tanh((1/10)*k).*(1+(0.125e-2*(8+cosh(.4*k)-2*tanh(.1*k).^2))./sinh(.1*k).^4); figure plot(k,y,'b',[min(k) max(k)],[0 0],'r'),axis([min(k) max(k) min(y) max(y)]); 上述代码中,n表示绘图时散点的个数,n应当取为较大的数值,以防止漏解。 上述代码结果如附图3所示。从附图3中可见,原方程在k<100,以及k=1000附近存在两个解;此外,仔细观察可见,在k=0左右的细微局部也存在解,将此局部放大如附图4,可见在这细微局部内,存在两个解。 步骤2:求解 对于这种方程,MATLAB的fsolve函数可高效求解,根据步骤1.2中的分析,初值选为-0.1,0.1,100和1000,具体代码如下:CODE: |
求取多解的非线性代数方程所有数值解的方法-Matlab(转载小木虫)

