數值分析實驗之非線性方程求根(MATLAB實現)

1、實驗目的函數

  1. 瞭解通常非線性方程的求根是比較複雜的事情:要討論(或知道)它有無實根,有多少實根;知道求近似根經常使用的幾種方法,每種方法的特色是什麼。spa

  2. 用經過二分法(區間半分法)、不動點(也Picard)迭代法及Newton迭代(切線)法求其它非線性方程的根,並儘量估計偏差。命令行

2、實驗原理3d

    

 

 3、實驗程序blog

    

 

 4、實驗內容ip

   1. 用二分法求方程x3-3x-1=0在的全部根.要求每一個根的偏差小於0.001.io

   提示與要求: (1) 利用精度找到迭代次數;function

           (2) 由f(x)=3(x2-1)可取隔根區間[-2,-1].[-1,1].[1,2]);class

           (3) 用程序求各隔根區間內的根.原理

 2. 用不動點迭代求: (1)x3+2x2+10x-20=0的全部根.

           或: (2)9x2-sinx-1=0在[0,1]上的一個根.

 3. 用Newton迭代法求解下列之一,準確到10-5:

   (1) x3-x-1=0的全部根;

   (2) ex+2-x+2cosx-6=0位於[0,2]上的根.

 

 5、實驗程序

    • 二分法:

文件代碼:
function y = f(x)
y=x^3-3*x-1;
end

程序代碼:
function Bipart(a0,b0,tol)
%a0爲左區間,b0爲右區間,tol爲區間偏差限
a=a0;b=b0;
m=ceil(log((b-a)/tol)/log(2));
for k=1:m
    p=(a+b)/2;
    if f(p)*f(b)<0
        a=p;
    else
        b=p;
    end
end
disp(['通過二分法求得的跟爲:x=',num2str((a+b)/2,'%.6f')])
disp(['共通過',num2str(k),'次計算'])

命令窗口:
Bipart(-2,-1, 0.001)
Bipart(-1, 1, 0.001)
Bipart (1,2, 0.001)

 運行結果:

     

 

    • 不動點法:

文件代爲:
function y = f(x)
y=9*x^2-sin(x)-1;
end

程序代碼:
function Budongdian(x0,tol,m)
%x0爲初始值,tol爲偏差容限,m爲最大迭代次數
syms x
F(x)=sqrt(sin(x)+1)/3;
m=m;
text='';
x=[];
x(1)=x0;
for k=1:m
   x(k+1)=F(x(k));
   if (abs(x(k+1)-x(k))<=tol)==1
       text='迭代成功';
       disp(text);
       disp(['通過不動點迭代法求得的跟爲:x=',num2str(x(k+1),'%.7f')]);
       disp(['共通過',num2str(k),'次計算'])
       break
   end
end
if isempty(text)==1
    disp('Method failed')
end

命令窗口:
Budongdian(1, 0.00001, 100)

   運行結果:

  

 

    • 牛頓迭代法:

文件代碼:
function y = f(x)
y=exp(x)+2^(-x)+2*cos(x)-6;
end

程序代碼:
function Newton_gen(x0,tol,m)
%x0爲初始值,tol爲偏差容限,m爲最大迭代次數
syms x
F(x)=x-f(x)/diff(f(x));
m=m;
text='';
x=[];
x(1)=x0;
for k=1:m
   x(k+1)=F(x(k));
   if (abs(x(k+1)-x(k))<=tol)==1
       text='迭代成功';
       disp(text);
       disp(['通過Newton迭代法求得的跟爲:x=',num2str(x(k+1),'%.7f')]);
       disp(['共通過',num2str(k),'次計算'])
       break
   end
end
if isempty(text)==1
    disp('Method failed')
end

命令窗口:
Newton_ .gen(2, 0.00001, 100)

  運行結果:

   

另解:

 • 二分法:

定義函數:
function Bipart_2(a0,b0,tol,Tol)
%a0爲左區間,b0爲右區間,tol爲區間偏差限,Tol爲f偏差限
a=a0;b=b0;
m=ceil(log((b-a)/tol)/log(2));
for k=1:m
    p=(a+b)/2;
    if f(p)*f(b)<0
        a=p;
    else
        b=p;
    end
    if abs(f((a+b)/2))<Tol
        break;
    end
end
disp(['通過二分法求得的跟爲:x=',num2str((a+b)/2,'%.6f')])
disp(['共通過',num2str(k),'次計算'])
    
命令窗口:
Bipart. .2(-1, 1,0.001,0.1)
Bipart_ .2(-1, 1, 0.001, 0.000001)

  運行結果:

   

 

• 不動點法:

定義函數:
function [x,k]=budong(fun,x0,tol,m)
for k=1:m
    x=fun(x0);
    if abs(x-x0)<tol
 break;
end
x0=x;
end
x=vpa(x,8);

function t=fun(x1)
syms x;
f=9*x.*x-sin(x)-1;
s=subs(diff(f,x),x,x1);
x=x1;
f=9*x.*x-sin(x)-1;
t=x-f/s;

命令行窗口輸入:
[x,k]=budong(@fun,0.5,1e-5,100)

 運行結果:

     

相關文章
相關標籤/搜索