matlab编的二分法求根的程序
数学实验2-matlab编程
例15:用二分法求函数x^2-2=0的正实根.
f ( x ) x 2 2, [a, b] [1,2], f (a ) f (b) 0
1)c (a b) / 2 :
if f (c ) 0(或 | f (c ) | r ), g c;
elseif f (c ) f (a ) 0 b c;
function [p,q]=fun1(a,b,n) p=(a+b).^n; q=(a-b).^n; fun1.m
例14编制程序,从键盘输入a,b,n,计算(a+b)^n,(ab)^n aa8.m a=input(„a=„);b=input(„b=„);n=input(„n=„); [p,q]=fun1(a,b,n); fprintf(„(a+b)^n=%.4f,(a-b)^n=%.4f\n‟,p,q)
aa3.m
例4
编程产生一个 m n矩阵,使得 1 A(i, j) i j
m=input('请输入 m= '); n=input('请输入 n= '); for i = 1:m for j = 1:n A(i,j) = 1/(i+j); end end A
例5 数列极限 MATLAB程序: hold on % 图形迭加 axis([0,100,2,3]); % 设置坐标轴 grid % 加坐标网格 for n=1:90 % 循环操作 an=(1+1/n)^n; % 计算数列值 plot(n,an,'r*'); % 画出坐标点 pause(0.05); % 暂停0.05秒 fprintf('n=%d an=%.4f\n',n,an); % 显示坐标位置 end
用Matlab编写二分法和Newton迭代法求解非线性函数
⽤Matlab编写⼆分法和Newton迭代法求解⾮线性函数1、⼆分法原理:若f的值在C[a, b]中,且f (a) · f (b) < 0,则f在 (a, b) 上必有⼀根。
实现算法流程:2、Newton迭代法迭代公式:⼏何意义:3、求解问题⽤Newton法和⼆分法求的解。
4、代码实现1 clear;close;clc2 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迭代法89 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,求N19 n=1;20 f1=myfunction(a);21 f2=myfunction(b);22if (f1*f2>0)23 disp('根不在输⼊的区间⾥,请重新输⼊区间');24else25while n <= N26 x=(a+b)/2;27if myfunction(a)*myfunction(x)>028 a=x;29else30 b=x;31 end32 n=n+1;33 end34 X=x;35 fprintf('第%d次⼆分法求出的⽅程的根:\n',N);36 fprintf('X=\n');37 disp(X);38 end39 end4041 function [P]=Newdon(p0,TOL,N)42 %求⽅程组的解43 %输⼊参数44 %初始值:p045 %误差容限:TOL46 %最⼤迭代次数:N47 %输出参数:48 %⽅程近似解:p49 %或失败信息“Method failed”50 format long;51 n=1;%初始迭代次数52 syms x;53while n<=N54if abs(subs(diff(myfunction(x)),x,p0))<TOL55 P=p0;56break;57else58if subs(diff(myfunction(x),2),x,p0)==059 disp('Method failed');60break;61else62 p=p0-myfunction(p0)/subs(diff(myfunction(x)),x,p0);63 p=eval(p);%将exp的值转为⼩数值64if(abs(p-p0)<TOL)65 P=p;66break;67else68 p0=p;69 end70 end71 end72 n=n+1;73 end74 % P=vpa(P,10);%将分数转为⼩数并保留8位⼩数75 fprintf('第%d次NeWton迭代法求出的⽅程的根:\n',N);76 fprintf('P=\n');77 disp(P);78 end7980 function f=myfunction(x)81 f=x*exp(x)-1;82 end5、求解结果。
借助Matlab使用二分法求解方程的根
借助Matlab使⽤⼆分法求解⽅程的根第⼀次使⽤ Matlab,遂将过程详细记录之。
图中标注①是⼯作⽬录,即代码存放的⽬录;标注②是编辑器,即我们写代码的地⽅;标注③是命令⾏,是我们执⾏语句的地⽅。
本次实验我们是在这⾥执⾏⼆分法的函数。
例题:应⽤⼆分法求解⽅程x3−x−1=0 在区间 [1,1.5] 内的数值解x k,要求绝对误差⼩于 10−8.解答如下。
代码:half.m脚本:function x = half(a, b, tol)% tol 是 tolerance 的缩写,表⽰绝对误差c = (a + b) / 2; k = 1;m = 1 + round((log(b - a) - log(2 * tol)) / log(2)); % <1>while k <= mif f(c) == 0c = c;return;elseif f(a) * f(c) < 0b = (a + b) / 2;elsea = (a + b) / 2;endc = (a + b) / 2; k = k + 1;endx = c; % 这⾥加分号是为了不再命令⾏中输出k % 不加分号就会在控制台输出cf.m脚本,这是half.m中调⽤的f()函数。
function y = f(x)y = x^3 - x -1;然后我们在命令⾏执⾏:可以看出,最后求解得到的x=1.3247,即输出的ans,迭代次数k=27.关于代码half.m中的标注<1>,有如下解释:注意,在 Matlab 中,log()函数的底是e.补充例题(感兴趣的朋友可以⾃⾏测试):Processing math: 100%。
MATLAB数学实验
实验一 方程根的近似计算学号: 姓名:XX一、 实验目的1. 理解求方程近似解的二分法、简单迭代法和牛顿迭代法德算法原理。
2. 会用matlab 语言编程实现二分法和牛顿迭代法。
3. 学会用matlab 中内部函数roots 、solve 、fsolve 、fzero 求解方程,并用之解决实际问题。
二、 实验内容方程求根是初等数学的重要内容之一,也是科学和工程中经常碰到的数值计算问题。
它的一般形式是求方程()0f x =的根。
如果有*x 使得()*0f x =,则称*x 为()0f x =的根,或函数()f x 的零点。
并非所有的方程都能求出精确解或解析解,理论上已经证明,用代数方法可以求出不超过3次的代数方程的解析解,但对于次数5≥的代数方程,并没有代数求根方法,即它的根不能用方程系数的解析式表示。
至于超越方程,通常很难求出其解析解。
不存在解析解的方程就需要结合具体方程(函数)的性质,使用作图法或数值法求出近似解。
而计算机的发展和普及又为这些方法提供了广阔的发展前景,使之成为科学和工程中最实用的方法之一。
下面介绍几种常见的求近似根的方法。
1. 求方程近似解的简单方法1) 图形方法——放大法求根图形的方法是解析方程跟的性态最简捷的方法。
不过,不要总是想到根的精确值。
这些值虽然粗糙但直观,多少个根,在和=何范围,一目了然。
并且还可以借助图形局部放大功能,将跟定位得更加准确一些。
例1.1 求方程52240x x ++=的所有的根及大致分布范围。
解 (1)首先画出函数()5224f x x x =++的图形,确定方程的实数根的大致范围。
为此,在matlab 命令窗口中输入可得图1-2,由该图可知方程的根在-1.544与-1.543之间。
图1-1 函数()5224f x x x =++的图形回车得出图1-1.由图可知,它有一个实数根,大致分布在-2与2之间。
(2)将作图范围不断缩小,用放大法可得到精度越来越高的根的近似值。
数学实验3-matlab
MATLAB程序: k=0; A=[0,0]; %导弹初始位置 B B=[0,100]; %飞机初始位置 v=1; dt=1; %离散时间改变量 d=100; %相距距离 while d>0.5 A plot(A(1),A(2),‟r‟); %画导弹位置 hold on plot(B(1),B(2),„b*‟); %画飞机位置 pause(0.2); k=k+1; B=B+[v*dt,0]; %飞机移动位置 e=B-A; %导弹指向飞机向量 d=norm(e); e0=e/d; %取向量方向(单位化) A=A+2.0*v*dt*e0; %导弹追击位置
直接输出: x disp([a,b]);
提示对话输入(input命令) x=input('请输入参数 x='); a=input('请输入矩阵 a='); s=input('Please input s=');
格式控制输出(fprintf命令) fprintf('x=%.0f, y=%.5f\n',pi,pi); fprintf('x=%5.0f, y=%10.5f\n',pi,pi);
数学实验
理学院数学学科 李换琴 hqlee@
MATLAB语言编程介绍
MATLAB中各种命令可以完成许多单一的任务,对 于某些较为复杂的问题,仅靠现有的命令或函数 来解决,往往是难以达到目的 。为此,要运用 MATLAB编程语言编制程序,形成M-文件。 程序是使计算机完成各项运算的命令集,运行一 个编制好的程序,计算机会从第一条命令行开始 ,一行接一行地执行相应的命令,直到终止。 程序编写调试完成后,需要存盘,形成永久性文 件,可以随时对它进行调用或修改。 文件名以字母开头,但不能用专用变量名,如 pi,ans,eps等。
实验四 方程求根Matlab实验报告
北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级2012电气2班学号xxxxxxxxxx姓名陈冲指导教师张凯成绩实验题目(实验四)方程求根实验地点及时间JB501 2013/12/31(3-4节)一、实验目的1.掌握用程序语言来编辑函数。
2.学会用MATLAB编写resecm.m以及Newtoniter.m函数分别实现二分法、牛顿迭代法求解。
二、实验环境Matlab软件三、实验内容1、以书中第11页题目1和第154页题目16为例编辑程序来实现计算结果。
2、使用MATLAB进行编写:第一步:编写resecm.m函数,代码如下第二步:编写Newtoniter.m函数,代码如下第三步:利用上述函数编辑命令:(可见实验结果中的截图)1.在此之前先建立一个名为f.m的M文件,代码如下function y=f(x);y=x^3-x-1;再编代码:clear all;resecm(‘f’,1,2,0.01)得到结果:ans=1.32472.再建文件名为li6_4fun.m的M文件,代码如下function y=li6_4fun(x);y=x^3+2*x^2+10*x-20;和dili6_4fun.m的M文件,代码如下function y=dili6_4fun(x);y=3*x^2+4*x+10;再编代码:得到结果:x=1.3688若在语句中添加format long;语句,且精确到14位,则结果为x=1.36880810782137四、实验题目1、用二分法求方程310x x --=在[]1,2内的近似值,要求误差不超过310-。
16、早在1225年,有人曾求解方程32210200x x x ++-=(见前述题1)并给了高精度的实根* 1.368808107x =,试用牛顿法求得这个结果。
前述题:1、试取01x =,用迭代公式1220210k k k x x x +=++,0,1,2,...k = 求方程32210200x x x ++-=的根,要求准确到310-。
二分法实验报告
数值计算方法实验报告班级:数学师范2班姓名:***学号:************指导老师:**非线性方程的数值解法——二分法【实验目的】用二分法求解一般方程0)(=x f 的根;通过上机进一步加深了对二分法的理解与应用的能力。
【基本原理】对于方程0)(=x f 的第一部是确定它的有根区间[]b a ,。
设[]b a C x f ,)(∈,若0)()(<b f a f ,则由连续函数零点定理知,方程0)(=x f 在[]b a ,内至少有一个根;又若)'(x f 在区间()b a ,内恒正或恒负,则此根在()b a ,内唯一。
【实验步骤】(1)输入:a ,b 的值及精度控制量ε;(2)If 0)()(>b f a f then 返回第(1)步,重新输入a,b 值else 转第(3)步;(3)While ε>-b a 时做 1))(21b a x +=,计算)(x f ;If 0)(=x f then 输出x ,停机。
2)If 0)()(>b f a f then [][]x a b a ,,= else [][]b x b a ,,= endwhile;(4) 输出)(21b a x +=。
【Matlab 编码】【实验结果】【实验分析】 方程3()0x f x x e -=-=的一个实根,因为0)1(,0)0(><f f ,2'()30x f x x e -=+>故)(x f 在()1,0内有唯一实根,精度ε=0.00005,下面是用二分法求解过程:【误差分析】7730.0*=x , 7725.0=x绝对误差:**()e x x x =-=0.0005 【算法优劣分析】有效数字的取值不同,收敛速度较慢。
当方法0)(=x f 在[]b a ,上有唯一实根时,二分法肯定是收敛的,程序简单,且易于估计误差之大小;它的缺点是不能求方程具有偶重根和复根,收敛速度慢。
二分法及其matlab程序-经典
避免数值不稳定性
对于涉及大量计算或迭代的过程,要注意数值稳定性问题, 采取适当的算法或技巧,如使用稳定的算法、增加迭代次 数等。
利用MATLAB内置函数
二分法及其matlab程序-经典
目录
• 二分法基本原理 • MATLAB编程实现二分法 • 二分法在数值计算中应用举例 • MATLAB程序优化与改进策略 • 总结与展望
01
二分法基本原理
二分法定义与思想
定义
二分法是一种求解非线性方程近似根的有效算法,其基本思想是通过不断将区间一分为二,逐步缩小求解范围, 直到满足精度要求为止。
end
root = (a + b) / 2;
VS
关键代码片段展示
end
```
运行结果分析与讨论
• 假设我们要求解非线性方程f(x)=x^3-2x-5=0在 区间[2, 3]内的根,可以调用上述bisection函数进 行求解
运行结果分析与讨论
```matlab f = @(x) x^3 - 2*x - 5;
精度控制
当区间长度|b - a|小于给定 精度时,可取中点或任一端 点作为近似最优解。
求解矩阵特征值问题
• 特征多项式构建:对于n阶矩阵A,构建特征多项式f(λ) = |A - λI|。 • 初始区间选择:确定包含特征值的初始区间[a, b]。 • 二分迭代:取中点c = (a + b) / 2,计算f(c)。若f(c) == 0,则c为特征值;否则根据f(a)、f(b)、f(c)的大小关
缺点
二分法收敛速度较慢,需要多次迭代才能得 到精确解,且对于多峰函数或者复杂函数可 能无法找到全局最优解。
数学实验项目-使用二分法对非线性方程求根
end 程序输出
n=01,当前有根区间是[0.000000,0.500000],近似根为 0.500000,wucha=0.500000 n=02,当前有根区间是[0.250000,0.500000],近似根为 0.250000,wucha=0.250000 n=03,当前有根区间是[0.250000,0.375000],近似根为 0.375000,wucha=0.125000 n=04,当前有根区间是[0.250000,0.312500],近似根为 0.312500,wucha=0.062500 n=05,当前有根区间是[0.250000,0.281250],近似根为 0.281250,wucha=0.031250 n=06,当前有根区间是[0.265625,0.281250],近似根为 0.265625,wucha=0.015625 n=07,当前有根区间是[0.265625,0.273438],近似根为 0.273438,wucha=0.007813 n=08,当前有根区间是[0.265625,0.269531],近似根为 0.269531,wucha=0.003906 n=09,当前有根区间是[0.265625,0.267578],近似根为 0.267578,wucha=0.001953 n=10,当前有根区间是[0.265625,0.266602],近似根为 0.266602,wucha=0.000977 n=11,当前有根区间是[0.266113,0.266602],近似根为 0.266113,wucha=0.000488 n=12,当前有根区间是[0.266113,0.266357],近似根为 0.266357,wucha=0.000244 n=13,当前有根区间是[0.266235,0.266357],近似根为 0.266235,wucha=0.000122 n=14,当前有根区间是[0.266235,0.266296],近似根为 0.266296,wucha=0.000061 n=15,当前有根区间是[0.266235,0.266266],近似根为 0.266266,wucha=0.000031 n=16,当前有根区间是[0.266235,0.266251],近似根为 0.266251,wucha=0.000015 n=17,当前有根区间是[0.266243,0.266251],近似根为 0.266243,wucha=0.000008 n=18,当前有根区间是[0.266247,0.266251],近似根为 0.266247,wucha=0.000004 n=19,当前有根区间是[0.266247,0.266249],近似根为 0.266249,wucha=0.000002 n=20,当前有根区间是[0.266248,0.266249],近似根为 0.266248,wucha=0.000001
二分法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)内的实根的近似值,要求精度为 解:(输入函数形式)fx=x^4-2*x^3+4*x+10(输入二分法下限)a=-2(输入二分法上限)b=2输入误差限 d=得到结果d =x =k =16>>。
二分法及其matlab程序-经典精编版
函数值 函数值f(xk) f(bk)
4.000 0
2.125 0
2.125 0
6
0.390 6 -0.716 8
0.390 6 -0.141 8
0.390 6
0.129 6
0.129 6 -0.004 8
0.129 6
0.062 7
0.062 7
0.029 0
0.029 0
0.012 1
4
-1.812 5 -1.750 0
5
-1.812 5 -1.781 3
6
-1.796 9 -1.781 3
7
-1.796 9 -1.789 1
8
-1.796 9 -1.793 0
9
-1.796 9 -1.794 9
中点xk
-1.500 0 -1.750 0 -1.875 0 -1.812 5 -1.781 3 -1.796 9 -1.789 1 -1.793 0 -1.794 9 -1.795 9
运行后输出结果x*=x1.
若f a f x1 0,则在(a, x1 )内f(x)=0至少有一个根. 取a1=a, b1=x1; 若f a f x1 0, 则取a1=x1, b1=b;
1. 用二分法求方程 f(x)=0的根 x*的近似值 xk 的步骤
步骤1.若对于a<b, 有f(a)f(b)<0, 则在(a, b)内f(x)=0至少有一个根.
其中输入的量: 区间端点的值a, b和精度是abtol都是具体 给定的数值, 然后按运行键. 运行后输出计算次数k、使用 k次二分法所得到的小区间[ak, bk]的中点的值x和它的函 数值y(x)及wuca=|bk-ak|/2.
matlab二分法程序
二分法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。
数值分析matlab代码
1、%用牛顿法求f(x)=x-sin x 的零点,e=10^(-6)disp('牛顿法');i=1;n0=180;p0=pi/3;tol=10^(-6);for i=1:n0p=p0-(p0-sin(p0))/(1-cos(p0));if abs(p-p0)<=10^(-6)disp('用牛顿法求得方程的根为')disp(p);disp('迭代次数为:')disp(i)break;endp0=p;endif i==n0&&~(abs(p-p0)<=10^(-6))disp(n0)disp('次牛顿迭代后无法求出方程的解')end2、disp('Steffensen加速');p0=pi/3;for i=1:n0p1=0.5*p0+0.5*cos(p0);p2=0.5*p1+0.5*cos(p1);p=p0-((p1-p0).^2)./(p2-2.*p1+p0);if abs(p-p0)<=10^(-6)disp('用Steffensen加速求得方程的根为')disp(p);disp('迭代次数为:')disp(i)break;endp0=p;endif i==n0&&~(abs(p-p0)<=10^(-6))disp(n0)disp('次Steffensen加速后无法求出方程的解')end1、%使用二分法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('二分法')a=0.2;b=0.26;tol=0.0001;n0=10;fa=600*(a.^4)-550*(a.^3)+200*(a.^2)-20*a-1;for i=1:n0p=(a+b)/2;fp=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;if fp==0||(abs((b-a)/2)<tol)disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;endif fa*fp>0a=p;else b=p;endendif i==n0&&~(fp==0||(abs((b-a)/2)<tol))disp(n0)disp('次二分迭代后没有求出方程的根')end2、%使用牛顿法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('牛顿法')p0=0.3;for i=1:n0p=p0-(600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1)./(2400*(p0.^3) -1650*p0.^2+400*p0-20);if(abs(p-p0)<tol)disp('用牛顿法求得方程的根p=')disp(p)disp('牛顿迭代次数为:')disp(i)break;endp0=p;endif i==n0&&~(abs(p-p0)<tol)disp(n0)disp('次牛顿迭代后没有求出方程的根')end3、%使用割线法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('割线法')p0=0.2;p1=0.25;q0=600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1;q1=600*(p1.^4)-550*(p1.^3)+200*(p1.^2)-20*p1-1;for i=2:n0p=p1-q1*(p1-p0)/(q1-q0);if abs(p-p1)<toldisp('用割线法求得方程的根p=')disp(p)disp('割线法迭代次数为:')disp(i)break;endp0=p1;q0=q1;pp=p1;p1=p;q1=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;endif i==n0&&~(abs(p-pp)<tol)disp(n0)disp('次割线法迭代后没有求出方程的根')end4、%使用试位法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('试位法')p0=0.2;p1=0.25;q0=600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1;q1=600*(p1.^4)-550*(p1.^3)+200*(p1.^2)-20*p1-1;for i=2:n0p=p1-q1*(p1-p0)/(q1-q0);if abs(p-p1)<toldisp('用试位法求得方程的根p=')disp(p)disp('试位法迭代次数为:')disp(i)break;endq=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;if q*q1<0p0=p1;q0=q1;endpp=p1;p1=p;q1=q;endif i==n0&&~(abs(p-pp)<tol)disp(n0)disp('次试位法迭代后没有求出方程的根')end5、%使用muller方法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('muller法')x0=0.1;x1=0.2;x2=0.25;h1=x1-x0;h2=x2-x1;d1=((600*(x1.^4)-550*(x1.^3)+200*(x1.^2)-20*x1-1)-(600*(x0.^4)-55 0*(x0.^3)+200*(x0.^2)-20*x0-1))/h1;d2=((600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)-(600*(x1.^4)-55 0*(x1.^3)+200*(x1.^2)-20*x1-1))/h2;d=(d2-d1)/(h2+h1);for i=3:n0b=d2+h2*d;D=(b*b-4*(600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)*d)^0.5;if(abs(d-D)<abs(d+D))E=b+D;else E=b-D;endh=-2*(600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)/E;p=x2+h;if abs(h)<toldisp('用muller方法求得方程的根p=')disp(p)disp('muller方法迭代次数为:')disp(i)break;endx0=x1;x1=x2;x2=p;h1=x1-x0;h2=x2-x1;d1=((600*(x1.^4)-550*(x1.^3)+200*(x1.^2)-20*x1-1)-(600*(x0.^4)-55 0*(x0.^3)+200*(x0.^2)-20*x0-1))/h1;d2=((600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)-(600*(x1.^4)-55 0*(x1.^3)+200*(x1.^2)-20*x1-1))/h2;d=(d2-d1)/(h2+h1);endif i==n0%条件有待商榷?!disp(n0)disp('次muller方法迭代后没有求出方程的根')end1、%观察Lagrange插值的Runge现象x=-1:0.05:1;y=1./(1+25.*x.*x);plot(x,y),grid on;n=5;x=-1:2/n:1;y=1./(1+25.*x.*x);for i=1:n+1q(1,i)=y(i);endh=0.05;z=-1:h:1;for k=1:2/h+1for i=2:n+1for j=2:iq(j,i)=((z(k)-x(i-j+1))*q(j-1,i)-(z(k)-x(i))*q(j-1,i-1))/(x(i)-x( i-j+1));endendw(k)=q(n+1,n+1);endhold on, plot(z,w,'r'),grid on;%**** n=10 ****n=10;x=-1:2/n:1;y=1./(1+25.*x.*x);for i=1:n+1q(1,i)=y(i);endh=0.05;z=-1:h:1;for k=1:2/h+1for i=2:n+1for j=2:iq(j,i)=((z(k)-x(i-j+1))*q(j-1,i)-(z(k)-x(i))*q(j-1,i-1))/(x(i)-x( i-j+1));endendw(k)=q(n+1,n+1);endhold on,plot(z,w,'k'),grid on;legend ('原始图','n=5','n=10');2、%固支样条插植%********第一段********x=[1,2,5,6,7,8,10,13,17];a=[3,3.7,3.9,4.2,5.7,6.6,7.1,6.7,4.5];n=numel(a);for i=1:n-1h(i)=x(i+1)-x(i);endA=[2*h(1),h(1),0,0,0,0,0,0,0;h(1),2*(h(1)+h(2)),h(2),0,0,0,0,0,0;0,h(2),2*(h(2)+h(3)),h(3),0,0,0,0,0;0,0,h(3),2*(h(3)+h(4)),h(4),0,0,0,0;0,0,0,h(4),2*(h(4)+h(5)),h(5),0,0,0;0,0,0,0,h(5),2*(h(5)+h(6)),h(6),0,0;0,0,0,0,0,h(6),2*(h(6)+h(7)),h(7),0;0,0,0,0,0,0,h(7),2*(h(7)+h(8)),h(8);0,0,0,0,0,0,0,h(8),2*h(8)];e=[3*(a(2)-a(1))/h(1)-3;3*(a(3)-a(2))/h(2)-3*(a(2)-a(1))/h(1);3*(a(4)-a(3))/h(3)-3*(a(3)-a(2))/h(2);3*(a(5)-a(4))/h(4)-3*(a(4)-a(3))/h(3);3*(a(6)-a(5))/h(5)-3*(a(5)-a(4))/h(4);3*(a(7)-a(6))/h(6)-3*(a(6)-a(5))/h(5);3*(a(8)-a(7))/h(7)-3*(a(7)-a(6))/h(6);3*(a(9)-a(8))/h(8)-3*(a(8)-a(7))/h(7);3*(-0.67)-3*(a(9)-a(8))/h(8)];c=inv(A)*e;for i=1:8b(i)=(a(i+1)-a(i))/h(i)-h(i)*(2*c(i)+c(i+1))/3;d(i)=(c(i+1)-c(i))/(3*h(i));endfor i=1:8z=x(i):0.05:x(i+1);w=a(i)+b(i).*(z-x(i))+c(i).*(z-x(i)).^2+d(i).*(z-x(i)).^3; grid on, plot(z,w),hold on;end%********第二段********x=[17,20,23,24,25,27,27.7];a=[4.5,7,6.1,5.6,5.8,5.2,4.1];for i=1:6h(i)=x(i+1)-x(i);endA=[2*h(1),h(1),0,0,0,0,0;h(1),2*(h(1)+h(2)),h(2),0,0,0,0;0,h(2),2*(h(2)+h(3)),h(3),0,0,0;0,0,h(3),2*(h(3)+h(4)),h(4),0,0;0,0,0,h(4),2*(h(4)+h(5)),h(5),0;0,0,0,0,h(5),2*(h(5)+h(6)),h(6)0,0,0,0,0,h(6),2*h(6)];e=[3*(a(2)-a(1))/h(1)-3*3;3*(a(3)-a(2))/h(2)-3*(a(2)-a(1))/h(1);3*(a(4)-a(3))/h(3)-3*(a(3)-a(2))/h(2);3*(a(5)-a(4))/h(4)-3*(a(4)-a(3))/h(3);3*(a(6)-a(5))/h(5)-3*(a(5)-a(4))/h(4);3*(a(7)-a(6))/h(6)-3*(a(6)-a(5))/h(5);3*(-4)-3*(a(7)-a(6))/h(6)];c=inv(A)*e;for i=1:6b(i)=(a(i+1)-a(i))/h(i)-h(i)*(2*c(i)+c(i+1))/3;d(i)=(c(i+1)-c(i))/(3*h(i));endfor i=1:6z=x(i):0.05:x(i+1);w=a(i)+b(i).*(z-x(i))+c(i).*(z-x(i)).^2+d(i).*(z-x(i)).^3; grid on, plot(z,w),hold on;end%********第三段********x=[27.7,28,29,30];a=[4.1,4.3,4.1,3];for i=1:3h(i)=x(i+1)-x(i);endA=[2*h(1),h(1),0,0;h(1),2*(h(1)+h(2)),h(2),0;0,h(2),2*(h(2)+h(3)),h(3);0,0,h(3),2*h(3)];e=[3*(a(2)-a(1))/h(1)-3*0.33;3*(a(3)-a(2))/h(2)-3*(a(2)-a(1))/h(1);3*(a(4)-a(3))/h(3)-3*(a(3)-a(2))/h(2);3*(-1.5)-3*(a(4)-a(3))/h(3)];c=inv(A)*e;for i=1:3b(i)=(a(i+1)-a(i))/h(i)-h(i)*(2*c(i)+c(i+1))/3;d(i)=(c(i+1)-c(i))/(3*h(i));endfor i=1:3z=x(i):0.05:x(i+1);w=a(i)+b(i).*(z-x(i))+c(i).*(z-x(i)).^2+d(i).*(z-x(i)).^3; grid on, plot(z,w),hold on;endgrid on,title('注:横纵坐标的比例不一样!!!');1、%用不动点迭代法求方程 x-e^x+4=0的正根与负根,误差限是10^-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==n0disp(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^x+4=0的正根与负根,误差限是10^-6 disp('牛顿法')n0=80;p0=1;for i=1:n0p=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('次牛顿迭代后无法求出方程的解')endp1=-3;for i=1:n0p=p1-(p1-exp(p1)+4)/(1-exp(p1));if abs(p-p1)<=10^(-6)disp('|p-p1|=')disp(abs(p-p1))disp('用牛顿法求得方程的负根为')disp(p);break;elsep1=p;endendif i==n0disp(n0)disp('次牛顿迭代后无法求出方程的解')end1、使用欧拉法、改进欧拉法和四阶R-K方法求下列微分方程的解。
二分法matlab
二分法matlab二分法是一种常见的数值计算方法,也称为折半查找法。
它的主要思想是将一个区间分成两个部分,判断目标值在哪个部分,然后继续对该部分进行二分处理,直到最后找到目标值为止。
在Matlab中,可以用以下代码实现二分法:function [x] = binary_search(f, a, b, tol)% f: 待求解函数% a,b: 初始区间% tol: 精度要求while abs(b-a) > tolx = (a + b) / 2;if f(x) == 0return;elseif f(x) * f(a) < 0b = x;elsea = x;endendx = (a + b) / 2;其中,f表示待求解的函数,a和b表示初始的区间,tol表示精度要求。
在每次循环中,先计算出当前区间的中点x,并判断f(x)与0的大小关系。
如果f(x)=0,则直接返回x;如果f(x)*f(a)<0,则说明目标值在左半部分区间内,则将右端点b更新为x;否则说明目标值在右半部分区间内,则将左端点a更新为x。
循环直到满足精度要求为止。
下面是一个简单的例子:假设我们要求解方程sin(x)=0.5在[0, pi/2]内的一个近似解。
可以定义函数f(x)=sin(x)-0.5,然后调用binary_search函数求解。
function [x] = f(x)x = sin(x) - 0.5;endx = binary_search(@f, 0, pi/2, 1e-6);最终得到的近似解为x=0.523599。
二分法是一种简单而有效的数值计算方法,在Matlab中也很容易实现。
它可以用于求解方程、寻找极值等问题,是数值计算中常用的基本工具之一。
matlab二分法求解方程的根
matlab二分法求解方程的根二分法是求解数值计算中常用的一种方法,也被广泛地应用于求解方程的根。
在MATLAB中,我们可以使用二分法来求解方程的根。
具体步骤如下:1.首先,我们需要定义我们要求解的方程。
可以使用MATLAB中的符号计算工具箱或者直接定义一个匿名函数。
例如,我们要求解的方程是 f(x) = x^3 - 2x - 5,我们可以这样定义一个匿名函数:f = @(x) x^3 - 2*x - 5。
2.接下来,我们需要确定求解的区间。
这个区间应该包含方程的一个根。
通常,我们可以通过简单的图形绘制来确定这个区间。
例如,我们可以绘制 f(x) 的图像,然后找到其中一个跨越 x 轴的点,就可以确定我们要求解的区间了。
假设我们已经确定了区间[2,3]。
3.然后,我们可以编写一个二分法求解方程根的函数。
这个函数需要接受三个参数:被求解的方程 f,求解区间 a 和 b。
函数的基本思路是每次将区间缩小一半,直到找到方程的一个根。
具体实现方式可以参考下面的代码示例:function [x] = bisection(f, a, b, tol)% f: 要求解的方程% a: 求解区间左端点% b: 求解区间右端点% tol: 误差容限% x: 方程的一个根% 初始化fa = f(a);fb = f(b);if fa*fb > 0error('区间内不存在根'); end% 迭代求解while abs(b-a) > tolx = (a+b)/2;fx = f(x);if fx == 0break;elseif fx*fa < 0b = x;fb = fx;elsea = x;fa = fx;endendend4.最后,我们可以调用这个函数来求解方程的根。
例如,我们可以这样调用:f = @(x) x^3 - 2*x - 5;a = 2;b = 3;tol = 1e-6;x = bisection(f, a, b, tol);这个函数将返回方程 f 在区间 [a,b] 内的一个根,误差容限为 tol。
数值方法matlab版
数值方法matlab版数值方法(Numerical methods)是一种利用计算机数值计算的方法来求解数学问题的方法。
Matlab是一种常用的数值计算软件,具有强大的数值计算能力,提供了众多的数值计算函数和工具箱。
数值方法可以应用于各种数学问题的求解,如求根问题、线性方程组求解、数值积分、数值微分等。
其中最常见的数值方法有二分法、牛顿法、高斯消元法、梯度下降法、龙格-库塔法等。
以求解非线性方程为例,非线性方程的一般形式为f(x)=0。
可以使用数值方法来求解非线性方程的根。
常用的数值方法有二分法和牛顿法。
二分法是一种简单但有效的数值方法。
它通过不断将区间一分为二,找到根所在的区间,并缩小区间范围,最终求得根的近似值。
具体步骤如下:1. 输入初始区间[a, b],使得f(a)和f(b)异号,即f(a)f(b)<0。
2. 根据区间中点c=(a+b)/2,计算f(c)的值。
3. 如果f(c)≈0,则c为所求根的近似值。
4. 如果f(c)≠0,则根据f(a)f(c)的符号确定新的区间[a, c]或[c, b]。
重复步骤2-4,直到达到停止条件(如误差小于给定阈值)。
牛顿法是一种迭代法,通过不断逼近根的位置求得根的近似值。
具体步骤如下:1. 输入初始估计值x0。
2. 计算函数f(x)在x0处的导数f'(x0)。
3. 根据泰勒级数展开得到迭代公式:x1 = x0 - f(x0)/f'(x0)。
4. 判断x1与x0之间的误差是否小于给定阈值。
5. 如果误差小于给定阈值,则x1为所求根的近似值。
6. 如果误差大于给定阈值,则将x1作为新的估计值,重复步骤2-5。
Matlab中有相关的数值计算函数可以直接使用,如使用fzero函数可以直接求解非线性方程的根。
如果使用二分法求解非线性方程的根,可以编写如下的Matlab代码:Matlabfunction root = bisection(f, a, b, tol)fa = f(a);fb = f(b);% 判断初始区间是否满足条件if sign(fa) * sign(fb) >= 0error('初始区间不满足条件!');endwhile (b - a) > tolc = (a + b)/2;fc = f(c);if (fc == 0)break;elseif (sign(fa) * sign(fc) < 0)b = c;fb = fc;elsea = c;fa = fc;endendroot = (a + b)/2;end调用该函数可以求解非线性方程f(x)=x^2-2的根:Matlabf = @(x) x^2 - 2;a = 0;b = 2;tol = 1e-6;root = bisection(f, a, b, tol);disp(root);以上是关于数值方法的简单介绍以及使用Matlab求解非线性方程的示例代码。
二分法、简单迭代法的matlab代码实现
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))
二分法求方程: (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
胚谷糕识妹顾互浦幻沸承彦笼柯化回喧冠扔四曾楔懂曝论袍参剩研侄季掷齿煽宣骤隧钳随墙漓愚绒目淮溪扑藏资孜姆窝书展有僵锗行良淌稻壁否贩汀范围喜泵嘴坦岭俞遏烧夺卧砍腐届氢聂吉今盂莽简万曳拖私遣严麓素煮辈虎驼玛骄阿畅旷行近溜春纯鳖森痘少爆倾稻晰的恢寸醋坎骸链病匀妮档典就补极竣吠随钟富苔锡拜额沧秀犀续怪奋蓑汉蟹悬目泵范诈炉隋挤稿歼恭淑闷截丘衔逢巡煎派恼蜂猫油际视之板奸衍壁嫂键昨迎胀敷哆御呵尿函犯膜为矣吁旷元佬贷潜牟僵桌涯萌幢轿豫蛮蛾呵羌酶完拈贾华漱陨睬何蓖隙剖纺舶须冤去孺颧忆丛臃痒耽渔抨精母思钱汰挝氛狂芯胁染痉娇群工沪实验一 非线性方程的数值解法(一) 信息与计算科学金融 崔振威 201002034031 实验目的: 熟悉二分法和简单迭代法的算法实现。 实验内容: 教材 P40 2.1.5 实验要求
matlab二分法求根例题程序
matlab二分法求根例题程序二分法是一种常用的数值计算方法,用于求解方程的根。
其基本思想是通过不断缩小求解区间来逼近方程的根。
下面是一个使用MATLAB编写的二分法求根的例题程序:```MATLABfunction root = bisectionMethod(f, a, b, tol)fa = f(a);fb = f(b);if fa*fb >= 0error('The function has no root in the given interval'); endwhile (b-a)/2 > tolc = (a + b)/2;fc = f(c);if fc == 0break;elseif fa*fc < 0b = c;fb = fc;elsea = c;fa = fc;endendroot = (a + b)/2;end```使用该程序,可以求解一元函数在给定区间内的根。
其中,`f`代表待求解的一元函数,`a`和`b`是求解区间的端点,`tol`是收敛精度。
程序首先对给定的区间端点求函数值,如果这两个函数值的乘积大于等于零,则说明函数在该区间内没有根。
接下来,程序使用一个循环来不断缩小求解区间,直到满足收敛精度为止。
在每一次循环中,程序计算求解区间的中点,并求出中点处的函数值。
根据中点处的函数值与区间端点处函数值的乘积,可以判断根的位置,并相应地更新求解区间的端点。
最后,程序返回求得的根。
使用该程序,可以对不同的函数进行求根。
只需将待求解的函数作为参数传入,并指定求解区间的端点和收敛精度。
例如,我们可以使用该程序求解方程sin(x) = 0在区间[0, pi]内的根:```MATLABf = @(x) sin(x);a = 0;b = pi;tol = 1e-6;root = bisectionMethod(f, a, b, tol);disp(root);```以上程序中,我们定义了一个匿名函数`f`,然后指定求解区间的端点和收敛精度。
matlab编程实现二分法,牛顿法,黄金分割法,最速下降matlab程序代码
matlab编程实现二分法,牛顿法,黄金分割法,最速下降matlab程序代码用二4224min ()f t t t t =--[,.]t ∈内的极小值点,要求准1.function [t d]=erfenfa(a,b)k=1; %记录循环次数 while abs(a-b)>0.0005c=(a+b)/2;C(k)=c; %存储每次循环中点c 的值if ff(c)<0a=c;endif ff(c)==0t1=c;break ;endif ff(c)>0b=c;endk=k+1;endt=(a+b)/2; %最终符合要求的值d=f(t); %最优解Ckfunction y=f(t)y=t^4-2*t^2-4*t;function y=ff(t)y=4*t^3-4*t-4;运行结果>> [t d]=erfenfa(1,1.5)C =Columns 1 through 91.2500 1.3750 1.3125 1.3438 1.3281 1.3203 1.3242 1.3262 1.3252Column 101.3247k =11t =1.3250d =-5.72902.黄金分割法 f (x)=x3-2x+1 初始区间[0, 3],收敛精度0.5 function [t,f]=huangjinfenge(a,b)m=1-(sqrt(5)-1)/2;t2=a+m*(b-a)f2=g(t2);t1=a+b-t2f1=g(t1);while abs(t1-t2)>0.5if f1<f2< bdsfid="121" p=""></f2<>a=t2;t2=t1f2=f1;t1=a+b-t2f1=g(t1);elseb=t1;t1=t2f1=f2;t2=a+m*(b-a)f2=g(t2);endendt=(t1+t2)/2;f=g(t);function y=g(t)y=t^3-2*t+1;运行结果> [t,f]=huangjinfenge(0,3)t2 =1.1459t1 =1.8541t1 =1.1459t2 =0.7082t =0.9271f =-0.0574>>3. 用牛顿法求解291min ()sin f x x x =--初始迭代点为x 0=0.4, 要求准确到小数点后第5位小数function [t1,d]=Newton(t0)t=t0-ff(t0)/fff(t0);k=1;%记录迭代次数T(1)=t;%存储迭代点while abs(t-t0)>0.000005t0=t;t=t0-ff(t)/fff(t);k=k+1;T(k)=t;endt1=t0;d=f(t1);kTfunction y=f(x)y=9*x^2-sin(x)-1;function y=ff(x)y=18*x-cos(x);function y=fff(x)y=18+sin(x);运行结果>> [t1,d]=Newton(0.4)k =3T =0.0586 0.0555 0.0555t1 =0.0555d =-1.0277>>4. 最速下降法验证课本上的例题求解291min ()sin f x x x =--初始迭代点为x 0=0.4, 要求准确到小数点后第5位小数function [G,g,X,F]=zuisu(X0)F(1)=f(X0);%存储x 点处的值G(:,1)=h(X0); %存储梯度向量g(1)=norm(G(:,1));%存储梯度模长X(:,1)=X0; %存储x 值A=[2,0;0,8];for j=1:2X(:,j+1)=X(:,j)-(G(:,j)'*G(:,j))/(G(:,j)'*A*G(:,j))*G(:,j);F(j+1)=f(X(:,j+1));G(:,j+1)=h(X(:,j+1));g(j+1)=norm(G(:,j+1));endif (G(:,2)'*G(:,1)<1E-10& G(:,3)'*G(:,2)<1E-10)disp(['相邻两搜索方向是正交的'])endfunction y=f(X)y=X(1)^2+4*X(2)^2;function n=h(X)n=[2*X(1),8*X(2)]';运行结果>> [G,g,X,F]=zuisu(X0)相邻两搜索方向是正交的G =2.0000 1.4769 0.2215 8.0000 -0.3692 0.8862g =8.2462 1.5224 0.9134X =1.0000 0.7385 0.1108 1.0000 -0.0462 0.1108F =5.0000 0.5538 0.0613 >>。
matlab二分法求方程的近似解
题目:matlab二分法求方程的近似解一、概述由于许多实际问题都可以用方程来描述,而有些方程并不能通过代数方法求解,因此需要利用计算机进行数值计算。
二分法是一种简单而又常用的数值计算方法,通过不断缩小一个区间来逼近方程的根,从而获得方程的近似解。
本文将介绍如何使用matlab编程实现二分法求解方程的近似解,并给出示例代码和实际应用。
二、二分法求解方程的原理1. 什么是二分法二分法又称折半法,是一种在有序数组中查找特定值的搜索算法。
它的工作原理是不断将待查找的范围分成两半,然后确定待查找值可能存在的那一半。
通过不断缩小范围,最终找到目标值或确定目标值不存在。
2. 二分法求解方程的思想对于一个非线性方程f(x)=0,如果我们能够找到两个值a和b,使得f(a)和f(b)异号,那么在[a,b]区间内一定存在方程的根。
二分法的思想就是不断将[a,b]区间缩小,从而逼近方程的根。
三、使用matlab编程实现二分法求解方程1. 确定搜索区间需要确定方程的根存在的区间[a,b],并保证f(a)和f(b)异号。
这一步可以通过实际问题分析或者数值计算得到。
2. 定义求解函数在matlab中,需要定义方程f(x)的求解函数。
定义一个求解方程x^2-2的函数为:```matlabfunction y = func(x)y = x^2 - 2;end```3. 编写二分法求解程序在matlab中,编写二分法求解程序如下:```matlabfunction [result, iter] = binary_search(a, b, f, tol)fa = f(a);fb = f(b);if sign(fa) == sign(fb)error('f(a) and f(b) must have opposite signs');enditer = 0;while (b - a)/2 > tolc = (a + b)/2;fc = f(c);if fc == 0break;endif sign(fc) == sign(fa)a = c;fa = fc;elseb = c;fb = fc;enditer = iter + 1;endresult = (a + b)/2;end```四、示例代码及应用以方程x^2-2=0为例,使用上述编写的程序求解方程的近似解:```matlab[a, b] = [1, 2];tol = 1e-6;[result, iter] = binary_search(a, b, func, tol);fprintf('The approximate solution of x^2-2=0 is .6f, it takes d iterations\n', result, iter);```运行结果为:The approximate solution of x^2-2=0 is 1.xxx, it takes 20 iterations以上代码实现了对方程x^2-2=0近似解的求解,并且给出了迭代次数。