MATLAB用二分法、不動點迭代法及Newton迭代(切線)法求非線性方程的根

来源:http://www.cnblogs.com/kailugaji/archive/2017/05/30/6920975.html
-Advertisement-
Play Games

一、實驗原理 二、實驗步驟 三、實驗過程 1.(程式) (1)二分法:求 在區間(1,2)之間的根,取 (a)bipart.m: (b)fun1.m: (2)不動點迭代法:求方程在附近的根,取 (a)budong.m: (b)fun.m (3)牛頓迭代法:求方程在附近的根,取 newton.m: 2 ...


一、實驗原理

二、實驗步驟

三、實驗過程

1.(程式)

(1)二分法:求   在區間(12)之間的根,取

abipart.m:

function [x,m]=bipart(fun,a0,b0,tol)
a=a0;b=b0;
m=1+round(round(log((b-a)/tol))/log(2));
for k=1:m
    p=(a+b)/2;     
    if fun(p)*fun(b)<0
            a=p;
    else
            b=p;
    end
    x=p;
end
end 

(b)fun1.m:

function f=fun1(x)
f=x^3+10*x-20;

 2)不動點迭代法:求方程附近的根,取

(a)budong.m:

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);

   (b)fun.m

function t=fun(x1)
syms x;
f=x^3-2*x-5;
s=subs(diff(f,x),x,x1);
x=x1;
f=x^3-2*x-5;
t=x-f/s;

3)牛頓迭代法:求方程附近的根,取

newton.m:

function x1=newton(t1,esp,m)

syms x;

fun=x^3+2*x-5;

for k=1:m

    if abs(subs(diff(fun,'x'),x,t1))<esp

        x1=t1;

        break;

    else

        if subs(diff(fun,'x',2),x,t1)==0

            break;

            disp('解題失敗!')

        else

            t0=t1;

            t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);

            if abs(t1-t0)<esp

                x1=t1;

                break;

            end

        end

    end

end

x1=vpa(x1,8);

2.(運算結果)

(1)二分法:

>> [x,m]=bipart(@fun1,1,2,0.0001)
x =
    1.5945
m =
    14

  

(2)不動點迭代法:

>> [x,k]=budong(@fun,2,1e-5,100)
x =
2.0945515
k =
     4

  

(3)牛頓迭代法:

    

 >> x1=newton(2,1e-4,20)
     x1 =
        1.3282689
 

  

3.(拓展(方法改進、體會等))

對於方程的根為重根的情形,newton法求重根只是線性收斂,迭代緩慢,如果對於求重根的情形,對newton法進行改進,取

             ,

。用迭代法

                  

m重根,則具有二階收斂性,但要知道的重數m。

   計算方程的根是二重根,用newton法與改進方法求根。

源程式:

newton_biroot.m:

function t=newton_biroot(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-f/s;

biroot1.m:

function t=biroot1(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-2*f/s;

budong.m:

function [x,k]=budong(fun,x0,tol,m)

for k=1:m

    x=fun(x0);

    if abs(x-x0)<tol

        break;

    end

    x0=x;

    x=vpa(x,8)

end

x=vpa(x,8);

運行結果:取初值為2

k

          xk

newton

改進方法

1

          x1

1.75

1.5

2

          x2

1.5982143

 

1.4166667

 

3

          x3

1.5115099

 

1.4142157

 

4

          x4

1.4644275

 

1.4142157

 

 計算4步,改進方法就已經收斂,而newton法只是線性收斂,要達到同樣精度需迭代17次。

附結果:

>> [x,k]=budong(@biroot1,2,1e-5,3)

 

x =

 

1.5

 

 

x =

 

1.4166667

 

 

x =

 

1.4142157

 

 

x =

 

1.4142157

 

 

k =

 

     3

 

>> [x,k]=budong(@biroot1,2,1e-5,10)

 

x =

 

1.5

 

 

x =

 

1.4166667

 

 

x =

 

1.4142157

 

 

x =

 

1.4142136

 

 

k =

 

     4

 

>> [x,k]=budong(@newton_biroot,2,1e-5,50)

 

x =

 

1.75

 

 

x =

 

1.5982143

 

 

x =

 

1.5115099

 

 

x =

 

1.4644275

 

 

x =

 

1.439751

 

 

x =

 

1.4270955

 

 

x =

 

1.4206836

 

 

x =

 

1.4174559

 

 

x =

 

1.4158366

 

 

x =

 

1.4150256

 

 

x =

 

1.4146197

 

 

x =

 

1.4144166

 

 

x =

 

1.4143151

 

 

x =

 

1.4142643

 

 

x =

 

1.414239

 

 

x =

 

1.4142263

 

 

x =

 

1.4142199

 

 

k =

 

    17

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫代碼的不要耍小聰明,認認真真的敲。 代碼是給人看的,只是順便給機器去執行。 ...
  • 歡迎大家每天前來打卡~ 訓練營規則 每天出一道練習題,請大家自己完成編碼 第二天的文章中會告訴大家一種或幾種經典解決方法 完成練習的同學,歡迎大家把代碼貼在留言中 如果有問題,也請留言,我會找機會集中解答 希望這種手把手的方式能夠幫助大家儘快掌握C語言編程。 1. 例題 今天我們先來講解一道C語言的 ...
  • 要處理XML文檔,就要先解析(parse)他,解析器時這樣一個程式,讀入一個文件,確認整個文件具有正確的格式,然後將其分解成各種元素,使得程式員能夠訪問這些元素,Java庫提供了兩種XML解析器: 像文檔對象模型(Document Object Model,DOM)解析器這樣的樹型解析器,他們將讀入... ...
  • CASE WHEN 條件 THEN 改變的值 END 1.簡單case函數,使用表達式確定返回值: 語法: CASE title WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN ...
  • AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網路計算量。 訓練模型數據集 Stanford電腦視覺站點Stanford Dogs http://vision.stanfor ...
  • 7.1 raw_input(): raw_input()是python 的內建函數,通過讀取控制台的輸入與用戶實現交互。 raw_input()可以讓用戶輸入字元串(即等待用戶輸入內容),並存放到一個變數里。 運行結果: 7.2 getpass模塊: 輸入密碼時,如果想要不可見,需要利用 getpa ...
  • 對坦克大戰情有獨鍾是因為大學時候第一次參加程式設計比賽就做的這個游戲。當時用的語言是Java,那個比賽讓我悟出了面向對象的強大之處,我也是從那時開始接觸設計模式的。對我而言,坦克大戰有著非同尋常的意義,所以一定要帶大家用C++實現一下。 坦克大戰 我們依然使用EasyX在控制台程式中製作這個游戲程式 ...
  • 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程式,輸出結果是什麼? 答案如下: 2、C語言程式不使用任何條件運算符,列印出十次"Hello"? 答案如下: 或是: 3、如果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...