二分法、简单迭代法的matlab代码实现
- 格式:doc
- 大小:103.50 KB
- 文档页数:10
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二分法求根二分法,也称折半法或者二分查找法,是一种常见的数值计算方法。
它常常用于求解方程的根。
二分法的原理是将有根的某一区间迭代地对半分割,并比较根所在位置与新的子区间的关系,最终缩小到根的区间。
一、方法原理二分法求根的过程可以通过以下步骤来实现:Step 1:选择区间[a, b],这个区间必须满足f(a)和f(b)异号。
Step 2:将区间[a, b]以中点c划分为两个子区间,即[a, c]和[c, b]。
Step 3:判断f(c)与零的关系,如果f(c)= 0,则c就是方程的根,程序结束。
如果f(c)≠ 0,则分别判断f(c)与f(a)及f(b)的关系,并确定新的子区间。
Step 4:重复步骤2和步骤3,直到满足精度要求,程序结束。
function [c, k] = bisect(a, b, eps, maxit, f)%输入:参数a,b构成的区间[a, b],容差eps,最大迭代次数maxit,以及指定的函数f(必须可接受输入变量x)%输出:方程的根c以及迭代次数kfa = f(a);fb = f(b);if fa * fb > 0 %确保a,b两点的函数值异号error('Function has the same signs at endpoints of interval')endfor k = 1:maxit %迭代次数c = (a + b) / 2; %新的中间点c(迭代过程中b-a趋近于精度)fc = f(c);if fc == 0 || (b - a) / 2 < eps %找到根或者达到精度returnendif sign(fc) == sign(fa) %此时f(c)与f(a)同号,说明c与a之间没有根a = c;fa = fc;else %f(c)与f(b)同号,说明c与b之间没有根b = c;fb = fc;endenderror('Maximum number of iterations exceeded')三、使用实例为了说明如何使用二分法求根,考虑以下实例:求解方程f(x) = x³ - 5x - 9在区间[2,4]上的根。
二分法的matlab主程序function [k,x,wuca,yx]=erfen(a,b,abtol)a(1)=a; b(1)=b;ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数if ya* yb>0,disp('注意:ya*yb>0,请重新调整区间端点a和b.'), return endmax1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil是上取整for k=1: max1+1a;ya=fun(a); b;yb=fun(b); x=(a+b)/2;yx=fun(x); wuca=abs(b-a)/2; k=k-1;[k,a,b,x,wuca,ya,yb,yx]if yx==0a=x; b=x;elseif yb*yx>0b=x;yb=yx;elsea=x; ya=yx;endif b-a< abtol , return, endendk=max1; x; wuca; yx=fun(x);区间二分法:与对分查找法相同1 区间二分法求出的仅仅是方程的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根2 通常用区间二分法为一些迭代法提供靠近x^*的初始选代值;3 区间二分法的缺点是不能求方程的复数根。
format longa=5;b=6;x1=a;x2=b;f1=4*cos(x1)+4*sin(x1)+0.5*x1-2; f2=4*cos(x2)+4*sin(x2)+0.5*x2-2;step=0.000001;ii=0;while abs(x1-x2)>stepii=ii+1;x3=(x1+x2)/2;f3=4*cos(x3)+4*sin(x3)+0.5*x3-2;if f3~=0if f1*f3<0x2=x3;elsex1=x3;endendendx3f=[4*cos(x3)+4*sin(x3)+0.5*x3] disp(['迭代次数:',num2str(ii),'次'])牛顿迭代法求解:在方程f(x)=0有实数根的情况下,若能够将方程等价地转化成x=g(x)的形式,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推x(k+1)=g(x(k))可以得到一个序列xk,通常称g(x)为迭代函数,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。
在MATLAB中,可以使用以下代码实现基于迭代法的值分割:
```matlab
% 迭代法实现值分割
function [x_new, y_new] = iterative_value_segmentation(x, y, tol, max_iter)
% 初始化
x_new = x;
y_new = y;
iter = 0;
while iter < max_iter
% 计算x和y的差值
dx = x_new - x;
dy = y_new - y;
% 计算梯度
grad = dy ./ dx;
% 判断是否满足值分割条件
if abs(grad) < tol
break;
end
% 更新x和y的取值
x_new = x + dx;
y_new = y + dy * grad;
% 迭代次数加1
iter = iter + 1;
end
end
```
其中,输入参数x和y是原始数据,tol是值分割的阈值,max_iter是最大迭代次数。
函数返回分割后的x和y的新取值。
在函数中,首先初始化x_new和y_new为原始数据x和y,然后进入循环。
在每次迭代中,计算x和y的差值dx和dy,计算梯度grad,判断是否满足值分割条件。
如果满足条件,则跳出循环,返回分割后的x和y的新取值。
如果不满足条件,则更新x和y的取值,迭代次数加1,继续下一次迭代。
matlab找零点函数在MATLAB中,要寻找函数的零点,可以使用几种不同的方法,包括二分法、牛顿法、割线法和方程迭代法等。
下面将介绍这些方法的原理和MATLAB中的实现。
1. 二分法(Bisection Method):对于一个已知的连续函数 f(x),如果在区间 [a, b] 内 f(a) 和 f(b) 异号,则函数在该区间内至少存在一个零点。
二分法的基本思想是不断将区间二分,直到找到零点的近似解。
可以使用MATLAB内置函数 fzero 来实现二分法。
例如,对于函数 f(x)= x^2 - 4,在区间 [1, 3] 内寻找零点的代码如下:```matlabx = fzero(f, [1, 3]);disp(x);```2. 牛顿法(Newton's Method):牛顿法基于函数的泰勒级数近似,通过迭代逼近函数的零点。
其基本思想是在当前估计值 x0 处,通过函数f(x) 的导数 f'(x) 来计算下一个估计值 x1、可以使用MATLAB内置函数fzero 来实现牛顿法。
例如,对于函数 f(x) = x^2 - 4,在初始估计值x0 = 2 处寻找零点的代码如下:```matlabx0=2;x = fzero(f, x0);disp(x);```3. 割线法(Secant Method):割线法是在牛顿法的基础上做了改进,使用两个初始估计值 x0 和 x1 来逼近函数的零点。
割线法的迭代公式为x(n+1) = x(n) - f(x(n)) * (x(n) - x(n-1)) / (f(x(n)) - f(x(n-1)))。
同样,可以使用MATLAB内置函数 fzero 来实现割线法。
例如,对于函数 f(x) = x^2 - 4,在初始估计值 x0 = 1 和 x1 = 2 处寻找零点的代码如下:```matlabx0=1;x1=2;x = fzero(f, [x0, x1]);disp(x);```4. 方程迭代法(Fixed-Point Iteration Method):方程迭代法是将原方程 f(x) = 0 转化为等价的迭代方程 x = g(x),通过不断迭代g(x) 来逼近函数的零点。
在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牛顿迭代法程序代码牛顿迭代法主程序: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 給出常用的兩種解法。
本實驗是以解決一個方程解的問題說明兩種方法的精髓的。
具體之求解方程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求得的結果精度不夠。
文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。
数值方法实验班级:2011级数师一班学生姓名:雷宗玲学生学号:4011指导老师:李梦实验时间: 2014年5月30日中文摘要 (II)1引言 (1)2二分法的基本原理 (1)2.1 概述 (1)2.2 二分法的matlab基本程序 (2)2.2.1 实验步骤 (2)2.2.2 matlab的原程序 (3)3二分法的运用 (4)3.1 在实际生活中的运用 (4)3.2 在中学教学中的运用 (4)3.2.1 利用“二分法”思想巧证不等式 (4)3.2.2 利用“二分法”思想巧证一元二次方程根的分布 (5)3.2.3 利用“二分法”思想巧求最值 (6)3.3 在求解方程中的运用 (6)总结 (7)参考文献 (8)摘要:二分法无论在实际生活中,还是在科学上,都占有十分重要的地位。
在实际生活中,通常用来检查电路、水管等等,这是二分法最简单、最本质的一个应用。
在中学教学中,可以用二分法来巧证不等式、一元二次方程根的分布、求最值等等。
在求解n次多项式方程的根时,我们也可以利用二分法讨论一般方程式()0=f的实数根。
本文主要概述二分法的基本思想,并从以上几个方面,x对二分法在实际生活或科学上的应用论述,以便在以后的学习过程中得以广泛的应用。
关键词:查电路;证不等式;根的分布;求最值;求解1 引言在实际问题中,我们经常会遇到求非线性方程(代数方程或超越方程)根的问题。
对n 次多项式方程,由代数学基本定理知它有n 个根(含复数根,重根按重数计)。
而方程f(x)是多项式或超越函数(又分为代数方程或超越方程)。
对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。
因此,如何求得满足一定精度要求的方程的近似根,也就成为了我们迫切需要解决的问题。
近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。
如何在Matlab中进行迭代优化和迭代求解引言:Matlab是一种非常强大和流行的数值计算软件,广泛应用于工程、科学和数学等领域。
在问题求解过程中,迭代优化和迭代求解是常常使用的技术。
本文将介绍如何在Matlab中利用迭代方法进行优化和求解,以及相关的技巧和应用。
一、什么是迭代优化和迭代求解迭代优化指的是通过多次迭代,逐步接近优化问题的最优解。
常用的迭代优化方法包括梯度下降法、牛顿法、拟牛顿法等。
迭代求解则是通过多次迭代,逐步逼近方程或问题的解,常用的迭代求解方法有牛顿迭代法、弦截法、二分法等。
二、迭代优化的基本原理与方法1. 梯度下降法(Gradient Descent):梯度下降法是一种常用的迭代优化方法,用于寻找函数的极小值点。
其基本原理是通过计算函数对各个变量的偏导数,从当前点开始沿着负梯度的方向迭代更新,直至达到最小值。
在Matlab中,可以利用gradient函数计算梯度向量,并通过循环迭代实现梯度下降法。
2. 牛顿法(Newton's Method):牛顿法是一种迭代优化方法,用于求解非线性方程的根或函数的极值点。
其基本思想是利用函数的局部线性近似,通过求解线性方程组来得到函数的极值点。
在Matlab中,可以使用fminunc函数来实现牛顿法。
3. 拟牛顿法(Quasi-Newton Methods):拟牛顿法是一类迭代优化方法,主要用于求解无约束非线性优化问题。
其基本思想是通过构造逼近目标函数Hessian矩阵的Broyden-Fletcher-Goldfarb-Shanno(BFGS)公式或拟牛顿方法中的其他公式,来估计目标函数的梯度和Hessian矩阵。
在Matlab中,可以利用fminunc函数,并设置算法参数来实现拟牛顿法。
三、迭代求解的基本原理与方法1. 牛顿迭代法(Newton's Method):牛顿迭代法是一种常用的迭代求解方法,用于求解方程或问题的根。
二分法二分法基本思路一般地,对于函数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程序程序名称bisec_g.m调用格式bisec_g(‘f_name’,a,c,xmin,xmax,n_points)程序功能用二分法求非线性方程的根,并用示意图表示求根过程。
输入变量f_name为用户自己编写给定函数y=f(x)的M函数而命名的程序文件名;[a,c]为含根区间;xmin为图形横坐标轴的最小值;xmax为图形横坐标轴的最大值;x_points为自变量X的采样数。
function bisec_g(f_name,a,c,xmin,xmax,n_points)clf,hold off;clear Y_a,clear Y_c;wid_x=xmax-xmin;dx=(xmax-xmin)/n_points;xp=xmin:dx:xmax;yp=feval(f_name,xp);plot(xp,yp,'r');xlabel('x');ylabel('f(x)');title('Bisection Method'),hold on;ymin=min(yp);ymax=max(yp);wid_y=ymax-ymin;yp=0.0*yp;plot(xp,yp)fprintf('Bisection Scheme\n\n');fprintf('It a b c fa=f(a)');fprintf(' fc=f(c) abs(fc-fa) abs(c-a)/2\n'); tolerance=0.000001;it_limit=30;it=0;Y_a=feval(f_name,a);Y_c=feval(f_name,c);plot([a,a],[Y_a,0],'black');text(a,-0.1*wid_y,'x=a') plot([c,c],[Y_c,0],'black');text(c,-0.3*wid_y,'x=c') if(Y_a*Y_c>0)fprintf('f(a)f(c)>0\n');elsewhile 1it=it+1;b=(a+c)/2;Y_b=feval(f_name,b);plot([b,b],[Y_b,0],':');plot(b,0,'o');if it<4text(b,wid_y/20,[num2str(it)]);endfprintf('%3.0f%10.6f%10.6f',it,a,b);fprintf('%10.6f%10.6f%10.6f',c,Y_a,Y_c);fprintf('%12.3e%12.3e\n',abs(Y_c-Y_a),abs(c-a)/2);if (abs(c-a)/2<=tolerance)fprintf('Tolerance is satisfied.\n');breakendif (it>it_limit)fprintf('Iteration limit exceeded.\n');breakendif (Y_a*Y_b<=0)c=b;Y_c=Y_b;elsea=b;Y_a=Y_b;endendfprintf('Final result;Root=%12.6f\n',b);endx=b;plot([x,x],[0.05*wid_y,0.2*wid_y],'g');text(x,0.25*wid_y,'Final solution'); plot([x,(x-wid_x*0.004)],[0.05*wid_y,0.09*wid_y],'r') %arrow line plot([x,(x+wid_x*0.004)],[0.05*wid_y,0.09*wid_y],'r') %arrow line。
佛山科学技术学院实 验 报 告课程名称 数值分析实验项目 迭代法专业班级 机械工程 姓 名 余红杰 学 号 2111505010指导教师 陈剑 成 绩 日 期 月 日一. 实验目的1、 在计算机上用Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组 。
2、 在计算机上用二分法和Newton 迭代法求非线性方程 的根。
二. 实验要求1、按照题目要求完成实验内容;2、写出相应的Matlab 程序;3、给出实验结果(可以用表格展示实验结果);4、分析和讨论实验结果并提出可能的优化实验。
5、写出实验报告。
三. 实验步骤1、用Matlab 编写Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组Ax b =的程序。
2、用Matlab 编写二分法和Newton 法求非线性方程()0f x =的根程序。
3、设⎪⎪⎪⎭⎫ ⎝⎛--=212120203A ,T b )1,3,1(=,对于线性方程组b Ax =,考虑如下问题: (1)分别写出Jacobi 迭代矩阵和Gauss-Seidel 迭代矩阵(2)用Jacobi 迭代法和Gauss-Seidel 迭代法解该方程时,是否收敛?谁收敛的更快?(3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。
4、用调试好的二分法和Newton 迭代法程序解决如下问题求020sin 35=-+-x x e x 的根,其中控制精度810-=eps ,最大迭代次数50=M 。
四. 实验结果1.%Jacob.mfunction [x,B] = Jacob(A,b,n)%Jacobi迭代求解方程组Ax=b,系数矩阵A,迭代次数n%求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);J = D^(-1)*(L+U);B = J;f = D^(-1)*b;%初始化x即启动值:x = zeros(m,1);%根据x(k+1)=Jx(k)+f进行矩阵运算:for i=1:nx = J*x + f;end%GauSeid.mfunction [x,G] = GauSeid(A,b,n)%Gauss-Seidel迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);G = inv(D-L)*U;f = inv(D-L)*b;%初始化矩阵:%根据x(k+1)=Gx(k)+f进行矩阵运算:x = zeros(m,1);for i = 1:nx = G*x + f;end2.%Dichotomy.mfunction x=Dichotomy(x1,x2,p,n)%利用二分法求根,区间[x1,x2]%p为精度a = x1;b = x2;%进行n次二分:%第一个条件判断根在a,b区间内%第二个条件判断是否中间点就是根,是则迭代终止;%第三个条件判断二分后根在中点左侧还是右侧;%第四个条件判断精度是否达标,用区间长度代替for i=1:nif f(a)*f(b)<0x0 = (a+b)/2;p0 = (b-a)/(2^i);if f(x0)==0x = x0;elseif f(a)*f(x0)<0b = x0;else a= x0;endendendif p0>pcontinue;elsex = x0;break;endend%NewIterat.mfunction x=NewIterat(x0,p,n)%利用牛顿迭代法求根;%x0为启动点,估计的靠近根的值,p为精度,n为迭代次数;syms x1;%设置一个自变量x1,方便后面的求导:f1 = diff(f(x1));%进行n次迭代,精度达标会提前终止;%第一个判断是根据控制条件来确定真实误差是选绝对还是相对误差;%第二个判断是确定精度是否满足要求for i=1:nx1 = x0;x = x0-f(x0)/eval(f1);if x<1RealDiv = abs(x-x0);else RealDiv = abs(x-x0)/abs(x); endif RealDiv>px0 = x;else break;endend3.run43.mclc,clear;A = [3 0 -2;0 2 1;-2 1 2];b = [1;3;1];n1 = 50;n2 =100;%输入A,b矩阵,设置迭代次数为50次;%调用迭代函数,返回迭代矩阵;[x,B] = Jacob(A,b,n1);xj50 = x;f1 = max(abs(eig(B)))%显示谱半径,确定收敛性;[x,B] = GauSeid(A,b,n1);xg50 = x;f2 = max(abs(eig(B)))%谱半径;xj100 = Jacob(A,b,n2);xg100 = GauSeid(A,b,n2); Jacobi= [xj50,xj100]%对比迭代50次和100次的结果GauSei= [xg50,xg100]%很容易看出准确解为[1;1;1]4.f.mfunction y = f(x)%所有f(x)=0中f(x)函数;y = exp(5*x)-sin(x)+x^3-20; 下页是具体解时的程序:%run44.mclc,clear;%很容易看出在[0,1]间有解;x = Dichotomy(0,1,10^(-8),50)x = NewIterat(0,10^(-8),50)五. 讨论分析4.3实验中的迭代矩阵在上个部分,分别为J 和G ;对于收敛性,看下图中的f1,f2,也就是迭代矩阵的谱半径,都是小于1的,但是可以看出后者的谱半径更小,就是说它的收敛速度更快;最终求x 的值,每种迭代方法分别迭代50次(第一列)和100次(第二列); 实际值为[1;1;1]可以看出用高斯赛德尔迭代更精确,速度更快。
二分法、简单迭代法的 matlab 代码实现实验一非线性方程的数值解法(一)信息与计算科学金融崔振威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 xbxc 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,end end(二)、简单迭代法程序:function [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-x0)>eps & k<Nx0=x;x=feval(f,x0);k=k+1;endx0=x;if k==Nend解: a、g(x)=x 5-3x3-2x2+2二分法求方程:(1)、在 matlab 的命令窗口中输入命令:>>fplot('[x^5-3*x^3-2*x^2+2]',[-3,3]);grid得下图:由上图可得知:方程在[-3,3] 区间有根。
matlab迭代法代码matlab 迭代法代码1、%用不动点迭代法求方程x-e A x+4=0的正根与负根,误差限是10A-6% disp(' 不动点迭代法 ');n0=100;p0=-5;for i=1:n0p=exp(p0)-4;if abs(p-p0)<=10(6)if p<0disp('|p-p0|=')disp(abs(p-p0))disp(' 不动点迭代法求得方程的负根为 :')disp(p);break;elsedisp(' 不动点迭代法无法求出方程的负根 .')endelsep0=p;endendif i==n0 disp(n0) disp(' 次不动点迭代后无法求出方程的负根') endp1=1.7;for i=1:n0pp=exp(p1)-4;if abs(pp-p1)<=10(6)if pp>0disp('|p-p1|=')disp(abs(pp-p1))disp(' 用不动点迭代法求得方程的正根为 ')disp(pp);elsedisp(' 用不动点迭代法无法求出方程的正根 ');endbreak;elsep1=pp;endendif i==n0disp(n0)disp(' 次不动点迭代后无法求出方程的正根 ') end2、%用牛顿法求方程x-e A x+4=0的正根与负根,误差限是disp(' 牛顿法')n0=80;p0=1;for i=1:n0 p=p0-(p0-exp(p0)+4)/(1-exp(p0));if abs(p-p0)<=10(6)disp('|p-p0|=')disp(abs(p-p0))disp(' 用牛顿法求得方程的正根为 ')disp(p);break;elsep0=p;endendif i==n0disp(n0)disp(' 次牛顿迭代后无法求出方程的解p1=-3;for i=1:n0 p=p1-(p1-exp(p1)+4)/(1-exp(p1)); 10A-6') endif abs(p-p1)<=10A(-6) disp('|p-p1|=') disp(abs(p-p1)) disp(' 用牛顿法求得方程的负根为 ') disp(p); break; elsep1=p;endendif i==n0disp(n0)disp(' 次牛顿迭代后无法求出方程的解') end。
完美WORD格式姓名实验报告成绩评语:指导教师(签名)年月日说明:指导教师评分后,实验报告交院(系)办公室保存。
实验一 方程求根一、 实验目的用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。
并比较方法的优劣。
二、 实验原理 (1)、二分法对方程0)(=x f 在[a ,b]内求根。
将所给区间二分,在分点2a b x -=判断是否0)(=x f ;若是,则有根2a b x -=。
否则,继续判断是否0)()(<∙x f a f ,若是,则令x b =,否则令x a =。
否则令x a =。
重复此过程直至求出方程0)(=x f 在[a,b]中的近似根为止。
(2)、迭代法将方程0)(=x f 等价变换为x =ψ(x )形式,并建立相应的迭代公式=+1k x ψ(x )。
(3)、牛顿法若已知方程 的一个近似根0x ,则函数在点0x 附近可用一阶泰勒多项式))((')()(0001x x x f x f x p -+=来近似,因此方程0)(=x f 可近似表示为+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(')(00x f x f 。
取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。
迭代公式为:=+1k x -0x )(')(k k x f x f 。
三、 实验设备:MATLAB 7.0软件四、 结果预测(1)11x =0.09033 (2)5x =0.09052 (3)2x =0,09052 五、 实验内容(1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超过3105.0-⨯。
(2)、取初值00=x ,用迭代公式=+1k x -0x )(')(k k x f x f ,求方程0210=-+x e x的近似根。
要求误差不超过3105.0-⨯。
二分法二分法基本思路一般地,对于函数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>>欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
实验一非线性方程的数值解法(一)信息与计算科学金融崔振威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,endend(二)、简单迭代法程序:function [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-x0)>eps & k<Nx0=x;x=feval(f,x0);k=k+1;endx0=x;if k==Nend解:a、g(x)=x5-3x3-2x2+2二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x^5-3*x^3-2*x^2+2]',[-3,3]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。
(2)、二分法输出结果>> f='x^5-3*x^3-2*x^2+2'f =x^5-3*x^3-2*x^2+2>> bisect(f,-3,3,20,10^(-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=inline('x^5-3*x^3-2*x^2+2');>> [x0,k]=iterate(fun1,2)x0 =2k =1>> [x0,k]=iterate(fun1,1.5)x0 =NaNk =6>> [x0,k]=iterate(fun1,2.5)x0 =NaNk =5(3)、误差分析:由二分法和迭代法输出结果可知,通过定点迭代法得出方程的解误差比二分法大,而利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。
b、g(x)=cos(sin(x))二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[cos(sin(x))]',[-4,4]);grid得下图:由上图可得知:方程在[-4,4]区间无根。
(2)、二分法输出结果>>f='cos(sin(x))'f =cos(sin(x))>> bisect(f,-4,4,20,10^(-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=inline('cos(sin(x))');>> [x0,k]=iterate(f,0.5)x0 =0.7682k =15>> [x0,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)、由于该方程无解,所以无法比较误差。
c、g(x)=x2-sin(x+0.15)二分法求方程:(1)、在matlab的命令窗口中输入命令:>> fplot('[x^2-sin(x+0.15)]',[-10,10]);grid 得下图:由上图可得知:方程在[-3,3]区间有根。
(2)、二分法输出结果>> f='x^2-sin(x+0.15)'f =x^2-sin(x+0.15)>> bisect(f,-3,3,30,10^(-12))1.0000 -3.0000 3.0000 0 -0.14942.0000 -3.0000 0 -1.5000 3.22573.0000 -1.5000 0 -0.7500 1.12714.0000 -0.7500 0 -0.3750 0.36375.0000 -0.3750 0 -0.1875 0.07266.0000 -0.1875 0 -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.000315.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=inline('x^2-sin(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>> [x0,k]=iterate(f,0.001)x0 =0.3234k =500(3)、误差分析:由二分法和迭代法输出结果可知,利用二分法求出的结果中,可以清楚看出方程等于零时的解,其误差比迭代法小。