用Matlab编写二分法和Newton迭代法求解非线性函数

1、二分法

原理:若f 的值在C[a, b]中,且f (a) · f (b) < 0,则f(a, b)上必有一根。

用Matlab编写二分法和Newton迭代法求解非线性函数

实现算法流程:

用Matlab编写二分法和Newton迭代法求解非线性函数

2、Newton迭代法

迭代公式:

用Matlab编写二分法和Newton迭代法求解非线性函数

几何意义:

用Matlab编写二分法和Newton迭代法求解非线性函数

用Matlab编写二分法和Newton迭代法求解非线性函数

3、求解问题

用Newton法和二分法求

用Matlab编写二分法和Newton迭代法求解非线性函数

的解。

4、代码实现

 1 clear;close;clc
 2 a=0;b=1;%根区间
 3 e=10^(-6);%根的容许误差
 4 [X , N]=dichotomy(e,a,b);%二分法
 5 p0=0.5;%初始值
 6 N=15;%迭代次数
 7 [X1]=Newdon(p0,e,N);%Newton迭代法
 8 
 9 function [X , N]=dichotomy(deta,a,b)
10 % 函数dichotomy:二分法
11 %输入值:
12 %fun:方程函数
13 %deta:根的容许误差
14 %有根区间:[a,b]
15 %输出值
16 %X:求解到的方程的根
17 %N:总的迭代次数
18 N=1+fix(log2((b-a)/deta));%由公式7.2求得,取整数|X_N-X*|<=(b-a)/2^N<deta,求N
19 n=1;
20 f1=myfunction(a);
21 f2=myfunction(b);
22 if (f1*f2>0)
23     disp(\'根不在输入的区间里,请重新输入区间\');
24 else
25     while n <= N
26     x=(a+b)/2;
27     if myfunction(a)*myfunction(x)>0
28         a=x;
29     else
30         b=x;
31     end
32     n=n+1;
33     end
34     X=x; 
35     fprintf(\'第%d次二分法求出的方程的根:\n\',N);
36     fprintf(\'X=\n\');
37     disp(X);
38 end
39 end
40 
41 function [P]=Newdon(p0,TOL,N)
42 %求方程组的解
43 %输入参数
44 %初始值:p0
45 %误差容限:TOL
46 %最大迭代次数:N
47 %输出参数:
48 %方程近似解:p
49 %或失败信息“Method failed”
50 format long;
51 n=1;%初始迭代次数
52 syms x;
53 while n<=N
54     if abs(subs(diff(myfunction(x)),x,p0))<TOL
55         P=p0;
56         break;
57     else
58         if subs(diff(myfunction(x),2),x,p0)==0
59             disp(\'Method failed\');
60             break;
61         else
62             p=p0-myfunction(p0)/subs(diff(myfunction(x)),x,p0);
63             p=eval(p);%将exp的值转为小数值
64             if(abs(p-p0)<TOL)
65                 P=p;
66                 break;
67             else
68                 p0=p;
69             end
70         end
71     end
72     n=n+1;
73 end
74 % P=vpa(P,10);%将分数转为小数并保留8位小数
75 fprintf(\'第%d次NeWton迭代法求出的方程的根:\n\',N);
76 fprintf(\'P=\n\');
77 disp(P);
78 end
79 
80 function f=myfunction(x)
81 f=x*exp(x)-1;
82 end

5、求解结果

用Matlab编写二分法和Newton迭代法求解非线性函数