二分法、简单迭代法的matlab代码实现
matlab二分法求根编程

MATLAB二分法求根编程介绍MATLAB是一种强大的数值计算工具,广泛应用于工程、科学和数学领域。
其中,二分法是一种用于求解方程根的常用算法。
通过将区间不断二分,并逐步缩小根的范围,最终找到方程的解。
本文将详细介绍如何使用MATLAB编程实现二分法求根算法。
二分法求根原理二分法求根基于区间不断缩小的原理。
假设我们要求解一个方程f(x)=0的根。
首先,我们需要确定一个包含根的初始区间[a,b]。
通过计算f(a)和f(b)的符号,我们可以判断根是否在该区间内。
如果f(a)和f(b)的符号相同,表示a和b两点的函数值同号,根据零点定理,根不在该区间内。
在这种情况下,我们需要重新选择一个新的区间。
通过将区间划分为两部分,我们可以确定新的区间。
假设区间的中点为c,那么我们可以计算f(c)的符号。
如果f(c)为零,则c即为方程的根。
否则,我们可以判断f(c)和f(a)的符号,如果它们的符号相同,则根位于区间[c,b]内。
反之,如果f(c)和f(a)的符号不同,则根位于区间[a,c]内。
通过不断缩小区间的范围,最终可以找到方程的根。
编程实现为了使用MATLAB实现二分法求根算法,我们可以按照以下步骤进行编程:步骤1:定义函数首先,我们需要定义方程的函数。
假设我们要求解方程x2−4=0的根。
我们可以在MATLAB中定义一个函数,例如:function y = f(x)y = x^2 - 4;end步骤2:确定初始区间接下来,我们需要确定一个初始的区间[a,b]。
我们可以简单地选择两个数,使得f(a)和f(b)的符号不同。
例如,我们可以选择a=1和b=3。
步骤3:实现二分法求根算法我们可以使用一个循环来实现二分法求根算法。
在每一次循环中,我们计算区间的中点c,并判断f(c)的符号。
根据符号的不同,我们更新区间[a,b]的左端点或右端点。
循环终止的条件可以是区间长度小于某个特定的阈值,或者我们达到了最大迭代次数。
matlab的迭代法编程

在MATLAB 中,迭代法是一种通过重复执行一系列步骤来解决问题的方法。
以下是一个使用迭代法求解方程根的示例:
matlab
function=iterative_Method(,,,)
=;
while abs(f())>
=-f()/df();
endend
function=df()
=-1;end
=@()^2-2;
=1;
=2;
=1e-6;
=iterative_Method(,,,);disp(['方程 x^2 - 2 = 0 的根为 ',
num2str()]);
在上述代码中,iterative_Method函数接受一个函数f、区
间[a,b]和精度eps作为输入。
它通过迭代更新x的值,直到abs(f(x))小于eps为止。
在每次迭代中,它使用导数df(x)来更新x的值。
df函数返回导数-1,因为对于方程x^2 - 2 = 0,其导数为2x,在区
间[a,b]内恒为-1。
最后,我们定义了函数f和区间[a,b],并调用iterative_Method函数求解方程的根。
结果将显示在命令窗口中。
运行上述代码,输出结果为:
plaintext
1.41421
这表示方程x^2 - 2 = 0的根约为1.41421,与方程的实际根√2非常接近。
你可以根据需要调整精度eps的值来获得更精确的结果。
[matlab二分法程序代码]matlab牛顿迭代法程序代码
![[matlab二分法程序代码]matlab牛顿迭代法程序代码](https://img.taocdn.com/s3/m/5cd37268a0116c175f0e48ea.png)
[matlab二分法程序代码]matlab牛顿迭代法程序代码篇一: matlab牛顿迭代法程序代码牛顿迭代法主程序:function?[k,x,wuca,yx]?=?newtonk=1;yx1=fun;yx2=fun1;x1=x0-yx1/yx2;while?abs>tolx0=x1;yx1=fun;yx2=fun1;k=k+1;x1=x1-yx1/yx2;endk;x=x1;wuca=abs/2;yx=fun;end分程序1:function?y1=funy1=sqrt-tan;end分程序2:function????y2=fun1%函数fun的导数y2=x/)-1/) );end结果:[k,x,wuca,yx]?=?newtonk?=8x?=0.9415wuca?=4.5712e-08yx?=-3.1530e-14[k,x,wuca,yx]?=?newtonk?=243x?=NaNwuca?=NaNyx?=NaN篇二: 二十个JA V A程序代码1百分制分数到等级分数package pm;public class SwitchTest {//编写程序,实现从百分制分数到等级分数的转换////>=90 A// 80~89 B// 70~79 C// 60~69 D// public static void main {int s=87;switch{case 10 :System.out.println;break; case 9 :System.out.println;break; case 8 :System.out.println;break;case 7 :System.out.println;break;case 6 :System.out.println;break; default :System.out.println;break; }}}2成法口诀阵形package pm;public class SwitchTest{public static void main{for{for{System.out.print+”\t”); }System.out.println;}}}3华氏和摄氏的转换法package pm;import java.util.Scanner;public class SwitchTest {public static void main {Scanner sc=new Scanner;while {System.out.println;String s = sc.next.trim;if ) {//做摄氏向华摄的转换System.out.println;double db = sc.nextDouble; double db2 = + 32;System.out.println;} else if ) {//做华摄向摄氏的转换System.out.println;double db = sc.nextDouble; double db2 = * 5 / 9;System.out.println + “C”); }else if){ break;}}}}package pm;import java.util.Scanner;public class SwitchTest{public static void main {Scanner sc=new Scanner;boolean flag=true;while {System.out.println; String str = sc.nextLine.trim; if || str.endsWith) {//做摄氏向华摄的转换30cString st = str.substring - 1);double db = Double.parseDouble;//[0,2)//2 double db=Double.valueOf.doubleValue; double db2 = + 32;System.out.println;} else if || str.endsWith) {//做华摄向摄氏的转换String st = str.substring - 1);double db = Double.parseDouble;//[0,2)//2 double db=Double.valueOf.doubleValue; double db2 = * 5 / 9;System.out.println + “C”); }else if){flag=false;}}}}4三个数的最大数package pm;public class SwitchTest {public static void main {int a=1,b=2,c=3,d=0;d=a>b?a:b;d=a>b?:;System.out.println;}}5简单计算器的小程序package one;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;public class Jsq implements ActionListener {private JFrame frame;private JButton[] bus;private JTextField jtx;private JButton bu;private char[] strs;private String d_one = ““;private String operator;public static void main { new Jsq;}/* 利用构造进行实例化*/ public Jsq { frame = new JFrame; jtx = new JTextField; bus = new JButton[16]; strs = “789/456*123-0.+=“.toCharArray; for { bus[i] = new JButton; bus[i].addActionListener; } bu = new JButton; bu.addActionListener; init; } /* GUI 初始化*/ public void init { JPanel jp1 = new JPanel; jp1.add; jp1.add; frame.add; } /* 事件的处理*/ public void actionPerformed { /*获取输入字符*/ String conn = arg0.getActionCommand; /*清除计算器内容*/ if ) { JPanel jp2 = new JPanel; jp2.setLayout); for { jp2.add; } frame.add; frame.pack; frame.setLocation; frame.setVisible; frame.setDefaultCloseOperation;d_one = ““; operator = ““; jtx.setText; return; } /*暂未实现该功能*/if){ return; } /*记录运算符,保存运算数字*/ if ) != -1) { if && ““.equals)) return; d_one = jtx.getText; operator = conn; jtx.setText; return; } /*计算结果*/ if ) { if && ““.equals)) return; double db = 0; if ) { db = Double.parseDouble + Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble - Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble * Double.parseDouble); jtx.setText; } if ) { db = Double.parseDouble / Double.parseDouble); jtx.setText; } d_one = db + ““; return; }//界面显示jtx.setText + conn);}}6三角形图案package pm;public class SwitchTest{public static void main{int n=5;for{for{System.out.print;}for{System.out.print;}System.out.println;}}}7输出输入的姓名package pm;import java.util.Scanner;public class SwitchTest{public static void main{String name=null;Scanner sca=new Scanner ; char firstChar; do{System.out.println; name=sca.nextLine; firstChar=name.charAt;}while);System.out.println;}}8一小时倒计时小程序package pm;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class SwitchTest {private JFrame frame;private JLabel jl1;private JLabel jl2;private JLabel jl3;/*主方法*/public static void main {new SwitchTest.getTime;}/*倒计时的主要代码块*/private void getTime{long time=1*3600;long hour =0 ;long minute =0 ;long seconds=0;while{hour=time/3600;minute=/60;seconds=time-hour*3600-minute*60; jl1.setText;jl2.setText;jl3.setText;try {Thread.sleep;} catch {e.printStackTrace;}time--;}}/*构造实现界面的开发GUI */ public SwitchTest{frame = new JFrame;jl1 = new JLabel;jl2 = new JLabel;jl3 = new JLabel;init;}/*组件的装配*/private void init{JPanel jp=new JPanel;jp.add;jp.add;jp.add;frame.add;frame.setVisible;frame.setLocation;frame.setSize;frame.setDefaultCloseOperation; } }9棋盘图案public class Sjx{public static void main{int SIZE=19;for{if{System.out.print;//两个空格}else{System.out.print);//两个空格}}System.out.println;// System.out.print:);for{System.out.print;//一个空格}else{System.out.print+” “);//一个空格}for{System.out.print;//两个空格}System.out.println;}}}10数组输出唐诗package day04;public class ArrayTest {public static void main{char[][] arr=new char[4][7];String s=“朝辞白帝彩云间千里江陵一日还两岸猿声啼不住轻舟已过万重山”; for{for{arr[i][j]=s.charAt;}for{for{System.out.print;}System.out.println;}}}11找出满足条件的最小数package day02;public class Fangk{public static void main{// for{// int q=i/1000;// int b=i/100%10;// int s=i/10%10;// int g=i%10;// if{ // System.out.println; // break; // }// }loop1: for{loop2: for{if{continue loop2;}for{for{if{ System.out.println); break loop1;}}}}}}} Min Number12判断一个数是否是素数package day02;public class Fangk{ public static void main{ int num=14;boolean flag=true;for{flag=false;break;}}if{System.out.println; }else{System.out.println; }}}////////////////////////////////////////////////////////////////////// package day04;import java.util.Scanner;public class A1{public static void main{int n;Scanner sca=new Scanner;System.out.println; n=sca.nextInt;if){System.out.println; }else{System.out.println;}public static boolean isPrimeNumber{ for{if{return false;}}return true;}}13一个数倒序排列package day02;public class Daoxu{public static void main{ int olddata=3758;int newdata=0;while{for{newdata=newdata*10+olddata%10; olddata=olddata/10; }System.out.println;}}}14将一个整数以二进制输出package day04;import java.util.Scanner; public class ArrayTest { public static void main{ int n; Scanner s=new Scanner; System.out.println; n=s.nextInt; for{if)!=0){System.out.print;}else{System.out.print;}if%8==0){System.out.print;}}}}15矩形图案package day02;public class Fangk {public static void main{ int m=5,n=6; for{System.out.print;}System.out.println;for{System.out.print;for{System.out.print; }System.out.print;System.out.println;}for{System.out.print;}}}16猜数字package day02;import java.util.Scanner;public class Csz {public static void main {Scanner s = new Scanner; int num = * 1000); int m=0; for{System.out.println; m=s.nextInt;if{System.out.println;}else if{System.out.println;}else{System.out.println; break;}if{System.out.println; }}if{System.out.println; }}}17.HotelManagerpackage hotel;import java.util.Scanner;public class HotelManager {private static String[][] rooms;// 表示房间public static void main {rooms = new String[10][12];String comm;// 表示用户输入的命令for {for {rooms[i][j] = “EMPTY”;}}//while {System.out.println;Scanner sca = new Scanner; System.gc;comm = sca.next;if ) {search;} else if ) {int roomNo = sca.nextInt;String name = sca.next;in;} else if ) {int roomNo = sca.nextInt;out;} else if ) {System.out.println;break;} else {System.out.println; }}}private static void out {if-1][-1])){ System.out.println;} return; } rooms[-1][-1]=“EMPTY”; System.out.println; private static void in { if-1][-1])){ System.out.println;return;}rooms[-1][-1]=name;System.out.println;}private static void search {for {//打印房间号for {if {System.out.print + “ “); } else {System.out.print + “ “); }}//打印房间状态System.out.println;for {System.out.print;}System.out.println;}}}18.StudentManagerpackage day05.student_manager;import java.util.Scanner;public class StudentManager {static int[][] scores=new int[6][5];static String[] students={“zhangsan”,”lisi”,”wangwu”,”zhaoliu”,”qianqi”,”liuba”}; static String[] courses={“corejava”,”jdbc”,”servlet”,”jsp”,”ejb”};public static void main {for{for{scores[i][j]=*100);}}Scanner s=new Scanner; String comm;while{System.out.println; comm=s.next;if){String para=s.next; avg;}else if){String course=s.next; sort;}else if){String student=s.next; String course=s.next; get;}else if){break;}else{System.out.println; }}}//main end!public static void avg{int sIndex=-1;//int cIndex=-1; for{ if){ sIndex=i; } } if{ for{ if){ cIndex=i; } } } if{ System.out.println; return; } double avg=0.0; if{ for{ avg+=scores[sIndex][i]; } avg/=scores[sIndex].length; System.out.println; }else{ for{ avg+=scores[i][cIndex]; } avg/=scores.length; System.out.println; } } public static void sort{ int[] courseScore=new int[scores.length]; if){//如果求总分的排名//求出每个学生的总分,将成绩存放在courseScore数组中for{ int studentSum=0; for{ studentSum+=scores[i][j]; }courseScore[i]=studentSum; } }else{//如果不是求总分排名int cIndex=-1; for{//找到这门课程的下标if){ cIndex=i; } } if{//如果是一门有效的课程//把scores数组中这一列的值放到courseScore数组中!for{ courseScore[i]=scores[i][cIndex]; } }else{//如果不是一门有效的课程System.out.println; return; } } String[] studentCopy=new String[students.length]; System.arraycopy; for{ for{ if{ int temp=courseScore[i]; courseScore[i]=courseScore[j]; courseScore[j]=temp; String stemp=studentCopy[i];studentCopy[i]=studentCopy[j]; studentCopy[j]=stemp; } } } int order=1; System.out.println; for{ if{ order--; }else{ order=i+1;} System.out.print;System.out.print;System.out.println;order++;}}public static void get{int sIndex=-1;int cIndex=-1;for{if){sIndex=i;}}if{System.out.println;return;}if){//如果求总分int studentSum=0;for{studentSum+=scores[sIndex][j];}System.out.println; return;}for{if){cIndex=i;}}if{System.out.println;return;}System.out.println;}}19.Fivepackage hotel;import java.util.Scanner;/*** 首先在程序第一次运行的时候,构建出棋盘,切以后* 不能再从新构建,知道结束,所以将其放到静态代码块中。
matlab计算方程的根

MATLAB计算方程的根一、引言在数学中,方程的根指的是方程中使得等式成立的未知数的值。
解方程是数学中的一项基本操作,它在各个领域都有广泛的应用。
M A TL AB是一种强大的数值计算工具,它提供了多种方法来求解方程的根。
本文将介绍如何使用MA TL AB计算方程的根,包括求解一元方程和多元方程的方法。
二、求解一元方程的方法1.代数方法代数方法是求解一元方程的常用方法之一,它通过移项、合并同类项等代数运算,将方程转化为更简单的形式,从而求解方程的根。
在M A TL AB中,我们可以使用符号计算工具箱(Sy mb ol ic Ma thT o ol bo x)来进行代数运算。
以下是一个求解一元方程的示例代码:s y ms xe q n=x^2-3*x+2==0;s o l=so lv e(eq n,x);2.迭代法迭代法是数值计算中常用的一种方法,它通过逐步逼近方程的根,最终得到一个满足精度要求的解。
M AT LA B提供了多种迭代法求解方程根的函数,如牛顿迭代法(`fz er o`函数)、二分法(`f ze ro`函数)、割线法(`f ze ro`函数)等。
以下是一个使用二分法求解一元方程根的示例代码:f=@(x)x^2-3*x+2;x0=0;%初始猜测值x=fz er o(f,x0);三、求解多元方程的方法1.数值解法对于多元方程组,数值解法是一种常见且有效的求解方法。
MA T LA B提供了多种数值解法的函数,如牛顿法(`f s ol ve`函数)、最小二乘法(`ls qn on li n`函数)等。
这些函数可以根据方程组的特点选择合适的算法进行求解。
以下是一个使用牛顿法求解多元方程组的示例代码:f=@(x)[x(1)^2+x(2)^2-4;x(1)^2-x(2)^2-1];x0=[1;1];%初始猜测值x=fs ol ve(f,x0);2.符号解法在某些情况下,我们可以使用符号计算工具箱来求解多元方程组的精确解。
二分法,牛顿迭代法,matlab

二分法、牛頓迭代法求方程近似解在一些科學計算中常需要較為精確的數值解,本實驗基於matlab 給出常用的兩種解法。
本實驗是以解決一個方程解的問題說明兩種方法的精髓的。
具體之求解方程e^(-x)+x^2-2*x=0,精度e<10^-5;;程序文本文檔如下%%%%%%二分法求近似解cleardisp('二分法求方程的近似解')format longsyms xf=inline('exp(-x)+x^2-2*x');%原函數%通過[x,y]=fminbnd(f,x1,x2)求出極小值點和極小值,進而確定%區間端點,從而確定解區間矩陣CX=[];C=[0 1.16;1.16 2] ; %C(:,1)為解區間的左端點,C(:,2)為解區間右端點ss=length(C); %統計矩陣C的行數,即為方程解的個數for i=1:ssa=C(i,1);b=C(i,2);%f(a)>=0,f(b)<=0e1=b-a;%解一的精度e0=10^-5;%精度ya=f(a);while e1>=e0x0=1/2*(a+b);y0=f(x0);if y0*ya<=0b=x0;elsea=x0;ya=y0;ende1=b-a;endA=[a,b,e1];%解的區間和精度X=[X;A];%解與精度構成的矩陣endX%%%%%%%牛頓迭代法disp('牛頓迭代法解方程的近似解')clear %清空先前變量syms x %定義變量y=exp(-x)+x^2-2*x;%原函數f=inline(y);f1=diff(y); %一階導函數g=inline(f1);format long %由於數值的默認精度為小數點后四位,故需要定義長形X=[];C=[0 1.16;1.16 2] ; %C(:,1)為解區間的左端點,C(:,2)為解區間右端點ss=length(C); %統計矩陣C的行數,即為方程解的個數for i=1:ssa=C(i,1);b=C(i,2);%f(a)>=0,f(b)<=0e0=10^-5; %要求精度i=1; %迭代次數x0=(a+b)/2;A=[i,x0]; %迭代次數,根值的初始方程t=x0-f(x0)/g(x0); %%%%迭代函數while abs(t-x0)>=e0 %%迭代循環i=i+1;x0=t;A=[A;i,x0];t=x0-f(x0)/g(x0);endA ;B=A(i,:);%迭代次數及根值矩陣X=[X;B];endX運行結果如下如若使用matal內置函數fzero,得到如下結果由兩者求得的結果知,使用函數fzero求得的結果精度不夠。
二分法matlab

二分法matlab二分法是一种常用的数值计算方法,也被称为二分查找或折半查找。
它通过将搜索范围逐渐缩小一半来快速定位目标值。
在MATLAB中,我们可以利用二分法来解决一些数值计算问题,下面将介绍二分法的原理和应用。
二分法的基本思想是将搜索范围一分为二,然后确定目标值位于左半部分还是右半部分,然后继续将该部分一分为二。
重复这个过程直到找到目标值或者确定目标值不存在。
二分法的核心就是不断将搜索范围缩小一半。
首先,我们需要确定搜索范围的初始值。
通常情况下,我们会选择数组或者有序列表的首尾元素作为搜索范围的边界。
然后,我们计算出搜索范围的中间位置,并将中间位置的值与目标值进行比较。
如果中间位置的值等于目标值,那么我们就找到了目标值;如果中间位置的值大于目标值,那么目标值可能在左半部分;如果中间位置的值小于目标值,那么目标值可能在右半部分。
根据比较结果,我们可以缩小搜索范围,重复上述步骤直到找到目标值或者确定目标值不存在。
二分法在MATLAB中的应用非常广泛。
下面以两个例子来说明二分法在MATLAB中的使用。
第一个例子是求解方程的根。
假设我们需要求解方程f(x)=0的根,其中f(x)是一个连续函数。
我们可以利用二分法来逼近方程的根。
首先,我们需要确定一个初始搜索范围[a, b],使得f(a)和f(b)的符号不同。
然后,我们可以使用二分法来逐步缩小搜索范围,直到找到一个近似的根。
第二个例子是查找有序列表中的某个元素。
假设我们有一个有序列表A,我们需要查找其中的某个元素x。
我们可以利用二分法来快速确定x是否在列表中,并返回其索引位置。
首先,我们需要确定初始搜索范围的左右边界。
然后,我们可以使用二分法来逐步缩小搜索范围,直到找到x或者确定x不存在于列表中。
二分法是一种常用的数值计算方法,在MATLAB中也有广泛的应用。
通过将搜索范围一分为二,二分法可以快速定位目标值,解决方程的根或者查找有序列表中的元素。
熟练掌握二分法的原理和应用,对于解决一些数值计算问题非常有帮助。
二分法matlab程序(推荐文档)

二分法二分法基本思路一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
假定f(x)在区间(x ,y )上连续先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b)>0,a<b① 如果f[(a+b)/2]=0,该点就是零点,如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2>=a ,从①开始继续使用 ② 中点函数值判断。
如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。
另外,二分法不能计算复根和重根。
二分法步骤用二分法求方程()0f x =的根*x 的近似值k x 的步骤① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。
② 取,a b 的中点12a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算,运行后输出结果*1x x =若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。
取111,a a b x ==;若1()()0f a f x >,则取111,a x b b ==;④ 若12k k b a ε-≤(ε为预先给定的要求精度)退出计算,运行后输出结果*2k k a b x +≈,反之,返回步骤1,重复步骤1,2,3 二分法Mtalab 程序syms x;fun=input('(输入函数形式)fx=');a=input('(输入二分法下限)a=');b=input('(输入二分法上限)b=');d=input('输入误差限 d=')%二分法求根%f=inline(x^2-4*x+4);%修改需要求解的inline 函数的函数体f=inline(fun);%修改需要求解的inline 函数的函数体e=b-a; k=0 ;while e>dc=(a+b)/2;if f(a)*f(c)<0b=c;elseif f(a)*f(c)>0a=c;elsea=c;b=cende=e/2; k=k+1;endx=(a+b)/2;x%x 为答案 k%k 为次数例题:用二分法计算方程4324100x x x -++=在(-2,2)内的实根的近似值,要求精度为0.0001解:(输入函数形式)fx=x^4-2*x^3+4*x+10(输入二分法下限)a=-2(输入二分法上限)b=2输入误差限 d=0.0001得到结果d =1.0000e-004x =2.0000k =16>>。
matlab二分法求根编程

matlab二分法求根编程MATLAB是一种强大的数学软件,它可以用于各种数学计算和数据分析。
其中,二分法求根是一种常见的数值计算方法,可以用于求解非线性方程的根。
在MATLAB中,我们可以使用二分法求根的函数fzero来实现这一过程。
二分法求根的基本思想是将非线性方程的根所在的区间不断缩小,直到找到根的近似值。
具体来说,我们可以先选取一个初始区间[a,b],然后计算出该区间的中点c=(a+b)/2,并计算出函数在c处的值f(c)。
如果f(c)的符号与f(a)相同,则根位于区间[c,b]中;否则,根位于区间[a,c]中。
我们可以不断重复这个过程,直到找到一个满足精度要求的根的近似值。
在MATLAB中,我们可以使用fzero函数来实现二分法求根。
该函数的基本语法为:x = fzero(fun,x0)其中,fun是一个函数句柄,表示需要求解的非线性方程;x0是一个初始值,表示我们需要在哪个点开始搜索根。
该函数会返回一个近似的根的值x。
下面是一个使用fzero函数实现二分法求根的例子:% 定义一个函数句柄,表示需要求解的非线性方程fun = @(x) x^3 - 2*x - 5;% 使用fzero函数求解该方程的根x = fzero(fun, [1, 2]);% 输出结果fprintf('The root of the equation is: %f\n', x);在这个例子中,我们定义了一个函数句柄fun,表示需要求解的非线性方程x^3 - 2*x - 5。
然后,我们使用fzero函数求解该方程的根,初始区间为[1,2]。
最后,我们输出求解得到的根的值。
总之,二分法求根是一种常见的数值计算方法,可以用于求解非线性方程的根。
在MATLAB中,我们可以使用fzero函数来实现这一过程。
通过合理地选择初始区间和精度要求,我们可以得到一个较为准确的根的近似值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一非线性方程的数值解法(一)信息与计算科学金融崔振威201002034031一、实验目的:熟悉二分法和简单迭代法的算法实现。
二、实验内容:教材P40 2.1.5三、实验要求1根据实验内容编写二分法和简单迭代法的算法实现2简单比较分析两种算法的误差3试构造不同的迭代格式,分析比较其收敛性(一)、二分法程序:function ef=bisect(fx,xa,xb ,n, delta)% fx是由方程转化的关于x的函数,有fx=0。
% xa解区间上限% xb解区间下限% n最多循环步数,防止死循环。
%delta为允许误差x=xa;fa=eval(fx);x=xb;fb=eval(fx);disp(' [ n xa xb xc fc ]');for i=1: nxc=(xa+xb)/2;x=xc;fc=eval(fx);X=[i,xa,xb,xc,fc];disp(X),if fc*fa<0xb=xc;else xa=xc;endif (xb-xa)<delta,break,e ndend(二)、简单迭代法程序:fun ctio n [x0,k]=iterate (f,x0,eps,N)if nargin<4N=500;endif nargin<3ep=1e-12;endx=x0;x0=x+2*eps;k=0;while abs(x-xO)>eps & k<NxO=x;x=feval(f,xO);k=k+1;endx0=x;if k==Nend解:a、g(x)=x 5-3X3-2X2+2二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x A5-3*x A3-2*x A2+2]',[-3,3]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。
(2 )、二分法输出结果>> f='xA5-3*xA3-2*xA2+2' f =X A5-3*X A3-2*X A2+2>> bisect(f,-3,3,20,10A(-12))2.0000 -3.0000 0 -1.5000 0.03133.0000 -3.0000 -1.5000 -2.2500 -31.61824.0000 -2.2500 -1.5000 -1.8750 -8.43015.0000 -1.8750 -1.5000 -1.6875 -2.96326.0000 -1.6875 -1.5000 -1.5938 -1.21817.0000 -1.5938 -1.5000 -1.5469 -0.53828.0000 -1.5469 -1.5000 -1.5234 -0.24059.0000 -1.5234 -1.5000 -1.5117 -0.101510.0000 -1.5117 -1.5000 -1.5059 -0.034311.0000 -1.5059 -1.5000 -1.5029 -0.001412.0000 -1.5029 -1.5000 -1.5015 0.015013.0000 -1.5029 -1.5015 -1.5022 0.006814.0000 -1.5029 -1.5022 -1.5026 0.002715.0000 -1.5029 -1.5026 -1.5027 0.000716.0000 -1.5029 -1.5027 -1.5028 -0.000317.0000 -1.5028 -1.5027 -1.5028 0.000218.0000 -1.5028 -1.5028 -1.5028 -0.000119.0000 -1.5028 -1.5028 -1.5028 0.000120.0000 -1.5028 -1.5028 -1.5028 -0.00002、迭代法求方程:迭代法输出结果:>> f=inlin e('x A5-3*x A3-2*x A2+2');>> [xO,k]=iterate(fu n1,2)x0 =>> [xO,k]=iterate(fu n1,1.5) x0 =NaNk =6>> [xO,k]=iterate(fu n1,2.5) x0 =NaN k =5(3)、误差分析:由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。
b、g(x)=cos(sin(x))二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[cos(si n(x))]',[-4,4]);grid得下图:由上图可得知:方程在[-4,4]区间无根。
(2 )、二分法输出结果>>f='cos(si n( x))'f = cos(s in( x))>> bisect(f,-4,4,20,10A(-12))2.0000 0 4.0000 2.0000 0.61433.0000 2.00004.0000 3.0000 0.99014.0000 3.0000 4.0000 3.5000 0.93915.0000 3.5000 4.0000 3.7500 0.84116.0000 3.7500 4.0000 3.8750 0.78427.0000 3.8750 4.0000 3.9375 0.75548.0000 3.9375 4.0000 3.9688 0.74129.0000 3.9688 4.0000 3.9844 0.734110.0000 3.9844 4.0000 3.9922 0.730511.0000 3.9922 4.0000 3.9961 0.728812.0000 3.9961 4.0000 3.9980 0.727913.0000 3.9980 4.0000 3.9990 0.727514.0000 3.9990 4.0000 3.9995 0.727315.0000 3.9995 4.0000 3.9998 0.727116.0000 3.9998 4.0000 3.9999 0.727117.0000 3.9999 4.0000 3.9999 0.727118.0000 3.9999 4.0000 4.0000 0.727019.0000 4.0000 4.0000 4.0000 0.727020.0000 4.0000 4.0000 4.0000 0.7270 2、迭代法求方程:迭代法输出结果:>> f=in li ne('cos(s in( x))');>> [x0,k]=iterate(f,0.5)x0 =0.7682k =15>> [xO,k]=iterate(f,1)x0 =0.7682k =15>> [x0,k]=iterate(f,1.5)x0 =0.7682k =16>> [x0,k]=iterate(f,2)x0 =0.7682k =15>> [x0,k]=iterate(f,2.5)x0 =0.7682k =14(3)、由于该方程无解,所以无法比较误差。
2c、g(x)=x -sin(x+0.15)二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot32-si n(x+0.15)]',[-10,10]);grid 得下图:(2 )、二分法输出结果>> f='x A2-si n(x+0.15)'x A2-s in( x+0.15)>> bisect(f,-3,3,30,10A(-12))1.0000 -3.00002.0000 -3.00003.0000 -1.50004.0000 -0.75005.0000 -0.37506.0000 -0.1875 3.0000 0 -0.14940 -1.5000 3.22570 -0.7500 1.12710 -0.3750 0.36370 -0.1875 0.07260 -0.0938 -0.04747.0000 -0.1875 -0.0938 -0.1406 0.01048.0000 -0.1406 -0.0938 -0.1172 -0.01919.0000 -0.1406 -0.1172 -0.1289 -0.004510.0000 -0.1406 -0.1289 -0.1348 0.002911.0000 -0.1348 -0.1289 -0.1318 -0.000812.0000 -0.1348 -0.1318 -0.1333 0.001113.0000 -0.1333 -0.1318 -0.1326 0.000114.0000 -0.1326 -0.1318 -0.1322 -0.0003 由上图可得知:方程在[-3,3]区间有根。
15.0000 -0.1326 -0.1322 -0.1324 -0.000116.0000 -0.1326 -0.1324 -0.1325 0.000017.0000 -0.1325 -0.1324 -0.1324 -0.000018.0000 -0.1325 -0.1324 -0.1325 -0.000019.0000 -0.1325 -0.1325 -0.1325 0.000020.0000 -0.1325 -0.1325 -0.1325 0.000021.0000 -0.1325 -0.1325 -0.1325 0.000022.0000 -0.1325 -0.1325 -0.1325 0.000023.0000 -0.1325 -0.1325 -0.1325 -0.000024.0000 -0.1325 -0.1325 -0.1325 0.000025.0000 -0.1325 -0.1325 -0.1325 -0.000026.0000 -0.1325 -0.1325 -0.1325 0.000027.0000 -0.1325 -0.1325 -0.1325 0.000028.0000 -0.1325 -0.1325 -0.1325 0.000029.0000 -0.1325 -0.1325 -0.1325 0.000030.0000 -0.1325 -0.1325 -0.1325 -0.00002、迭代法求方程:迭代法输出结果:>> f=i nlin e('x A2-si n(x+0.15)');>> [x0,k]=iterate(f,1.96)x0 =NaNk =12>> [x0,k]=iterate(f,0,2) x0 =-0.1494k =1>> [x0,k]=iterate(f,0.2) x0 =0.3234k =500>> [x0,k]=iterate(f,0.3) x0 =0.3234k =500>>[xO,k]=iterate(f,O.OO1)x0 =0.3234k =500(3)、误差分析:由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。