VBA程序:二分法求方程的根

合集下载

实验7二分法求方程的根

实验7二分法求方程的根

实验7二分法求方程的根实验7 二分法求方程的根一、问题:求324100x x +-=于区间[1,2]内的一个实根,且要求精确到0.001 二、算法:第一步:计算);(),(21b f y a f y ←←第二步:计算)(),(5.0000x f y b a x ←+←,若00ε<="" ,则输出0x="">否则转第三步; 第三步:若010<="" ,则置;,020y="">第四步; 第四步:若1ε>-a b 则转第二步;否则,输出0x 结束.三、练习编写程序或函数实现上以上区间的近似解,要求记录迭代次数。

函数或程序为:结果为:迭代次数为:四、逐步搜索法求方程根的存在区间在给定的区间[,]a b上判定根的大致分布,从区间左端点a出发,按某个预定的步长h一步一步地向右跨,每跨一步进行一次根的搜索,并记录所有的根的存在区间。

用你编写的程序搜索问题中[0,5]的根的存在区间,步长要求为0.1 h函数为:根的存在区间为:五、综合练习(选做)用逐步搜索法找到根的存在区间,并用二分法求出在该区间上方程根的近似解。

附:分组名单星期二下午5-6节第1组组长:陈絮莹缪妃何贵堂刘钰马倩第2组组长:李杰玉黎筱惠雷霞肖娴林碧珍朱元正第3组组长:陈静苏小丽李郑何淑楠田冬秀曾敬军第4组组长:杨欣王雪梅徐莉萍石小芳雷敏唐嘉第5组组长:杨佳悦郭滢李媛媛何可陈思露第6组组长:王钰琪寇玠杨丹熊晨曦周丹第7组组长:姚瑶高倩倩金杨周海宁杨琴第8组组长:雷芳陈艳王玉娇余非张雪王海燕星期三下午5-6节第9组组长:刘超慧王玉利秦佳丽张青梅廖婷程思远第10组组长:杨琴冯康欣黄宜纯田晓东郑美艳第11组组长:黄倩肖雪梅舒玉秀杨阳黄倩宋亚超第12组组长:乔欢曹人月万袁源刘学勤师小诚沈金勇第13组组长:张全兴程德超冯啸魏丹李茜罗凤菊第14组组长:张洋何婷婷刘云丹彭英萍马静第15组组长:杨丽王书琪袁杰宋慧玲杨璐萍李琳玲星期三下午7-8节第16组组长:李欢蒋书丽康斯梦王菊花李芝琴第17组组长:杨梅郑雨来李维刘玉兰羊玲第18组组长:左艳君古月黄文凤杨娟胡洲黄川第19组组长:吴星谭婷张欢向巧钱强陈虹弟第20组组长:曾大超胡敏马树述罗玉婷第21组组长:石章波拉吉石明岳榆川金小刚张泽松第22组组长:贾孙鹏袁鹏颜冬芹陈诚张博第23组组长:李自强黄金辉彭琦岳琪李宾李闯第24组组长:王文媛林小渝刘燕严英何思敏穆芦芸。

借助Matlab使用二分法求解方程的根

借助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%。

二分法求方程的实根

二分法求方程的实根

二分法求方程的实根一:实验目的 通过编程实现二分法,并利用所编程序求函数x e x y --=3在(0,1)的近似解,然后比较和计算器所求的结果,从理性和实践上认识两种计算方法。

二:基本原理连续函数的零点定理1、假定f(x)在区间(x ,y )上连续 , 先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2]。

2、假设f(a)<0,f(b)>0,a<b①令a a =1,()11121,b a x b b +==,如果f(x)=0,该点就是零点。

如果0)()(1<x f a f ,则新的有根区间为[][]x a b a ,,122=;否则[][]122,,b x b a =。

此时有[][]2211,,b a b a ⊃,且()112221a b a b -=-。

对区间[]22,b a 重复上述做法多步有[][][][] n n b a b a b a b a ,,,,332211⊃⊃⊃且()a b a b n n n -=--121(式1)记*x 为0)(=x f 的根,我们有[]n n b a x ,*∈,即),3,2,1(* =≤≤n b x a n n 由(式1)及夹逼定理有:*lim lim x b a n n n n ==∞→∞→,实际计算时,当ε<-)(n n a b 时,取)(21*n n b a x +≈作为所求根近似值。

三:实验步骤1:建立如下函数文件f.m :Function f=f(x)f=x e x --32:通过如下框图编写二分法程序:erfen.m开始输入f,a,b,delta计算fa,fb,fa*fbfa*fb>0计算最多二分次数max1计算c=(a+b)/2, fcfc=0fb*fc>0b=c,a=a a=c,b=b|a-b|<=0.0005结束是否是否是否是否(3)、在Matlab 命令窗口键入:[c,err,yc]=bisect(‘f ’,0,1,0.005)(4)、得出结果,并与计算器所得结果比较分析误差。

matlab二分法求根编程

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函数来实现这一过程。

通过合理地选择初始区间和精度要求,我们可以得到一个较为准确的根的近似值。

VBA程序:二分法求方程的根

VBA程序:二分法求方程的根

VBA程序:二分法求方程的根对于一般超越方程与高次代数方程求根的问题,可选用方法简单实用有效的不求导数的二分法,即在给定的寻根区间内,利用步步查找,二分缩小区间的方法,求出全部实根。

二分法求根程序框图见后附件。

主要标识符含义:A,B—方程求根区间的左、右端点[a,b]H—查根间距、跨步长度hEPS—计算精度值,ε=0.00001x A,y A—变化过程中的左端点点值及函数值x B,Y B—变化过程中的右端点点值及函数值x C,y C—变化过程中的中点点值及函数值算例已知方程式f(x)=x3-6x2+11x-6=0,求方程的根。

给定条件x∈[0.5,3.5],ε=0.00001,h=0.47。

迭代求解后,可得到方程的三个实根:x1=1x2=2x3=3VBA程序代码'声明方程求解给定的条件Dim a As Double, b As Double, h As Double, eps As Double'声明数组,用来放置根Dim dblRoot() As Double'统计根的个数Dim lCount As LongSub Main()Dim Xa As Double, Ya As Double, Xb As Double, Yb As Double'赋初值a = 0.5b = 3.5h = 0.47eps = 0.00001Xa = aXb = aYa = dblFx(Xa)Xb = Xb + hIf Xb > b Then Exit SubYb = dblFx(Xb)Call Root(Xa, Ya, Xb, Yb)End SubSub Root(Xa1 As Double, Ya1 As Double, Xb1 As Double, Yb1 As Double) If qqqRoot(Ya1, Yb1) ThenCall qRoot(Xa1, Ya1, Xb1, Yb1)ElseXa1 = Xb1Ya1 = Yb1Xb1 = Xb1 + hIf Xb1 > b Then Exit SubYb1 = dblFx(Xb1)'符合求根条件则求根计算,否则继续调整求根区间If qqqRoot(Ya1, Yb1) ThenCall qRoot(Xa1, Ya1, Xb1, Yb1)ElseCall Root(Xa1, Ya1, Xb1, Yb1)End IfEnd IfEnd Sub'判断是否符合求根条件Function qqqRoot(dblYa2 As Double, dblYb2 As Double) As Boolean If dblYa2 * dblYb2 <= 0 ThenqqqRoot = TrueElseqqqRoot = FalseEnd IfEnd FunctionSub qRoot(dblXa As Double, dblYa As Double, dblXb As Double, dblYb As Double) Dim dblXc As Double, dblYc As Double, dblXd As Double'是否满足条件,不满足继续缩小求根区间If Abs(dblYa - dblYb) > eps And Abs(dblXa - dblXb) > eps ThendblXc = (dblXa + dblXb) / 2dblYc = dblFx(dblXc)Call qqRoot(dblXa, dblYa, dblXb, dblYb, dblXc, dblYc)Else'求得一个根lCount = lCount + 1dblXd = (dblXa + dblXb) / 2'将所求根保存在数组中ReDim Preserve dblRoot(1 To lCount)dblRoot(lCount) = dblXd'改变求根区间,以便获取下一个根dblXa = dblXbdblYa = dblYbdblXb = dblXb + hIf dblXb > b Then Exit SubdblYb = dblFx(dblXb)Call Root(dblXa, dblYa, dblXb, dblYb)End IfEnd Sub'判断并缩小求根区间Sub qqRoot(dblXa1 As Double, dblYa1 As Double, dblXb1 As Double, dblYb1 As Double, dblXc1 As Double, dblYc1 As Double)If dblYa1 * dblYc1 > 0 ThendblXa1 = dblXc1dblYa1 = dblYc1ElsedblXb1 = dblXc1dblYb1 = dblYc1End IfCall qRoot(dblXa1, dblYa1, dblXb1, dblYb1)End Sub'要求根的方程式Function dblFx(dblX As Double) As DoubledblFx = dblX * dblX * dblX - 6 * dblX * dblX + 11 * dblX - 6End Function'显示根Sub DisplayRoot()Dim i As LongDim str As StringlCount = 0'调用求根程序Main'遍历并显示所求得的根For i = LBound(dblRoot) To UBound(dblRoot)str = str & "方程的第" & i & "根是:" & dblRoot(i) & Chr(10)Next iMsgBox strEnd Sub参考资料:实用数值计算方法与程序附:二分法求方程的根框图。

数学实验项目-使用二分法对非线性方程求根

数学实验项目-使用二分法对非线性方程求根

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

二分法求方程的根

二分法求方程的根
第一种二分法
用二分法求方程 f(x)=0的根 x*的近似值 xk 的步骤
步骤1.若对于a<b, 有f(a)f(b)<0, 则在(a, b)内f(x)=0至少有一个根.
步骤2. 取a,
b的中点
x1

a
2
b
,
计算
f
x1
步骤3. 若f x1 0,则x1是f(x)=0的根, 停止计算,
运行后输出结果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;
用二分法求方程 f(x)=0的根 x*的近似值 xk 的步骤
步骤1.若对于a<b, 有f(a)f(b)<0, 则在(a, b)内f(x)=0至少有一个根.
for k=1: max1+1 a;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==0 a=x; b=x; elseif yb*yx>0 b=x;yb=yx; else a=x; ya=yx; end if b-a< abtol , return, end end k=max1; x; wuca; yx=fun(x);
步骤2.取a, b的中点
x1
ab, 2
计算
f
x1
步骤3. 若 f x1 0, 则x1是f(x)=0的根, 停止计算,
运行后输出结果x*=x1.
若 f a f x1 0, 则在(a, x1 )内f(x)=0至少有一个根. 取a1=a, b1=x1;

数值分析实验报告之二分法求根 java

数值分析实验报告之二分法求根 java

《数值分析》实验报告实验三 非线性方程求根一、实验目的1.掌握二分法、牛顿迭代法等常用的非线性方程迭代算法;2.培养编程与上机调试能力。

二、实验要求1.用C 语言设计出二分法和牛顿法的程序,并且选择不同的初值,观察所需的迭代次数和迭代结果。

三、实验原理1.二分法计算f(x)=0的二分法如下:① 输入求根取间[a,b]和误差控制量ε,定义函数f(x)。

如果 0)()(<b f a f ,转②;否则退出选用其它求根方法② 当|a-b|>ε时,计算中点x=(a+b)/2以及f(x)的值;分情况处理ε<|)(|x f :停止计算,x x =*,转④0)()(<x f a f :修正区间 ],[],[b a x a →0)()(<b f x f :修正区间 ],[],[b a b x →③ 2*b a x += ④ 输出近似根*x四、实验内容1.用二分法求方程01)(3=--=x x x f 在区间[1.0,1.5]内的一个实根,要求精确到小数点后2位。

五、实验结果输入零点所在区间时:输入错误的区间时:二分法程序代码:import java.awt.Container;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.GridLayout;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.Color;import javax.swing.JLabel;import java.awt.Font;import javax.swing.JTextField;import javax.swing.JButton;import javax.swing.SwingConstants;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;public class Erfenfaa implements ActionListener{ JFrame frame;private JTextField textField1;private JTextField textField2;private JTextField textField3;private JTextField textField4;JPanel panel_1 ,panel_2 ,panel_22,panel_3 ,panel_4 ; JLabel label1,label2,labelaa,labelbb,label_2,label_3; JButton submit,cancel;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {new Erfenfaa();} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public Erfenfaa() {frame = new JFrame("二分法解方程");frame.setSize(380,480);frame.setVisible(true);frame.setContentPane(createcontentPane());frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);centerFrame();// frame.setBounds(100, 100, 396, 300);frame.setResizable(false);}public Container createcontentPane(){Container contentPane=frame.getContentPane();contentPane.setLayout(new GridLayout(5,1,5,0));//由上至下 4行1列panel_1 = new JPanel();//面板panel_1放置label1和label2panel_1.setLayout(new FlowLayout(FlowLayout.CENTER,5,35));panel_1.setBackground(Color.WHITE);label1 = new JLabel("二分法解方程");label1.setFont(new Font("宋体", Font.BOLD, 18));panel_22= new JPanel();//面板panel_1放置label1和label2panel_22.setLayout(new FlowLayout(FlowLayout.CENTER,5,35));panel_22.setBackground(Color.WHITE);label2 = new JLabel("y=x^3-x-1");label2.setBounds(180, 41, 101, 24);panel_2 = new JPanel();//面板jpanel_2放置a,b,控制误差量panel_2.setBackground(Color.WHITE);panel_2.setLayout(null);labelaa= new JLabel("请输入区间[a,b]中的a:");labelaa.setFont(new Font("宋体", Font.BOLD, 12));labelaa.setBounds(80, 10, 172, 15);textField1 = new JTextField(10);//textField1输入a的值textField1.setBounds(219, 7, 42, 21);labelbb = new JLabel("请输入区间[a,b]中的b:");labelbb.setFont(new Font("宋体", Font.BOLD, 12));labelbb.setBounds(80, 38, 172, 15);textField2 = new JTextField(10);//textField2输入b的值textField2.setBounds(219, 35, 42, 21);label_2 = new JLabel("请输入控制误差量:");label_2.setFont(new Font("宋体", Font.BOLD, 12));label_2.setBounds(80, 63, 117, 15);textField3 = new JTextField(10); //textField3输入控制误差量textField3.setBounds(191, 60, 66, 21);panel_3 = new JPanel();//面板panel_3放置确定和取消按钮panel_3.setBackground(Color.WHITE);panel_3.setLayout(new FlowLayout(FlowLayout.CENTER,20,30));submit = new JButton("确定");//确定按钮submit.addActionListener(this);submit.setHorizontalAlignment(SwingConstants.CENTER);cancel = new JButton("取消");//取消按钮cancel.addActionListener(this);cancel.setHorizontalAlignment(SwingConstants.CENTER);panel_4 = new JPanel();//面板panel_4放置“方程解”标签和输出解文本块panel_4.setBackground(Color.WHITE);panel_4.setLayout(new FlowLayout(FlowLayout.CENTER,5,30));label_3 = new JLabel("方程解为:");label_3.setFont(new Font("宋体", Font.BOLD, 12));label_3.setBounds(24, 8, 65, 15);textField4 = new JTextField();//输出解或区间范围不对textField4.setBounds(99, 5, 97, 15);textField4.setColumns(25);panel_1.add(label1);panel_22.add(label2);panel_2.add(labelaa);panel_2.add(textField1);panel_2.add(labelbb);panel_2.add(textField2);panel_2.add(label_2);//控制误差量panel_2.add(textField3);panel_3.add(submit);panel_3.add(cancel);panel_4.add(label_3);panel_4.add(textField4);contentPane.add(panel_1);contentPane.add(panel_22);contentPane.add(panel_2);contentPane.add(panel_3);contentPane.add(panel_4);return contentPane;}public void centerFrame(){//窗口居中int x,y,screenWidth,screenHeight,frameWidth,frameHeight;Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();screenWidth=screenSize.width;//取得屏幕宽度和高度screenHeight=screenSize.height;frameWidth=frame.getWidth();frameHeight=frame.getHeight();x=(screenWidth-frameWidth)/2;y=(screenHeight-frameHeight)/2;frame.setLocation(x,y);}public void actionPerformed(ActionEvent e) {//事件触发JButton button=(JButton)e.getSource();float a,b,p,w;if(button==submit){String o=textField1.getText();String l=textField2.getText();String m=textField3.getText();a= Float.parseFloat(o);b= Float.parseFloat(l);p= Float.parseFloat(m);w=b-a;if(z(a,b)==true){textField4.setText(String.valueOf(fun(w,b,a,p)));//浮点型强制转换为字符型}if(z(a,b)==false){textField4.setText(String.valueOf("方程值不在所输入的区间内,请选择其他方法"));}}if(button==cancel){textField1.setText("");textField2.setText("");textField3.setText("");}}public static boolean z(float a,float b){//判断区间是否包括零点float a11=y(a);float a21=y(b);if((a11*a21)<0){return true;}elsereturn false;}public static float y(float x){//设置y的函数,y=x^3-x-1float y;y=x*x*x-x-1;return y;}public static float fun(float w,float b,float a,float p){//二分法方程float X=0,x;while(Math.abs(w)>p){w=b-a;x=(a+b)/2;if(Math.abs(y(x))<p){X=x;break;}if(y(a)*y(x)<0){b=x;fun(w, b, a, p);}if(y(x)*y(b)<0){a=x;fun(w, b, a, p);}}return X;}}六、讨论分析。

2二分法求解非线性方程的根

2二分法求解非线性方程的根

实验2 二分法求解非线性方程的根计机系 041班姓名:刘文杰学号:200410714102【实验内容】1、方法介绍(1)输入区间端点值a、b,步长h,及精度控制量ε1,若|f(a)|< ε1,则a为原方程的一个近似根,若|f(b)|< ε1,则b为原方程的一个近似根。

(2)以h为步长,将区间[a,b]分为两个等距的小区间[a,c],[c,b]。

如果f(a)<0,f(c)>0,则根在[a,c]中,将区间[a,c]再分半,分点为x i,若|f(x i)|< ε1,则xi是方程的一个根。

(3)精度控制,若|f(x1)|< ε1,则x i是方程的一个根,否则重复(2)。

2、使用说明a:实数型,根之上界。

b:实数型,根之下界。

h:步长,实数型。

E:函数的精度,实数型。

ary:元素的一维数组,存放计算结果。

3、基本原理对于非线性方程,在某个范围内往往有不止一个的根,根的分布情况同时也可很复杂,面对这种情况,通常先将所考察的范围划分成若干子段,然后判断哪些子段内有根,这项手续称作根的隔离。

将所求的根隔离开来以后,再在有根子段内找出满足精度要求的近似根。

为此适当选取有根子段内某一点作为根的初始近似,然后运用迭代方法使之逐步精确化。

程序源代码:#include"stdio.h"#include"math.h"#include"conio.h"#include"iostream.h"double f(double x){return sin(x);}double dichotomy(double a1,double b1,double E){double c,y,y0;y0=f(a1);do{c=((a1+b1)/2.0);y=f(c);if(y*y0>0) a1=c;else b1=c;}while((b1-a1)>=E);return c;}void main(){int i,n=0;double E,a1,b1,R[20],a,b,h,y1,y2;cout<<"***********************二分法求解非线性方程的根*****************"<<endl;cout<<"请输入区间端点值a,b:"<<endl;cout<<"a=";cin>>a;cout<<"b=";cin>>b;cout<<"请输入步长h:"<<endl;cin>>h;cout<<"请输入精度控制量E:"<<endl;cin>>E;a1=a;b1=a1+h;for(;b1<=b;a1=a1+h,b1=b1+h){y1=f(a1);if(fabs(f(a1))<E) {R[n]=a1,n++;}y2=f(b1);if(y1*y2<0) {R[n]=dichotomy(a1,b1,E);n++;}}if(a1<b){b1=b;y1=f(a1);if(fabs(y1)<E) {R[n]=a1;n++;}y2=f(b1);if(y1*y2<0) {R[n]=dichotomy(a1,b1,E);n++;}}if(fabs(f(b))<E) {R[n]=b;n++;}cout<<"二分法求解非线性方程实根为:"<<endl;for(i=0;i<n;i++)cout<<R[i]<<endl;cout<<"***********************二分法求解非线性方程的根*****************"<<endl;getch();}4、实例求超越方程sinx=0在区间[-2,7]内的全部实根。

二分法求根

二分法求根

//用二分法求方程f(x)=x*x*x-2*x*x-4*x-7=0在[3,4]上根的近似值,
//精确到小数点后三位
//源程序
# include<stdio.h>
#include<math.h>
void main()
{
float f(float x);
float c,x1,x2;
x1=3.0;x2=4.0;
while((x2-x1)>0.0005){
c=(x1+x2)/2.0;
if (f(x1)*f(c)<0)
x2=c;
else
x1=c;
printf("根变化c=%f\n",c);}
printf("方程根c=%8.3f\n",c);
}
float f(float x)
{return (x*x*x-2*x*x-4*x-7);}
运行结果:
分析:二分法是逐次把又根区间分半,舍弃无根区间而保留有根区间的一种逼近根的方法,在这个过程中有根区间的长度以2的幂次方减少,当有根区间的长度小于给定的精度时,其中点就作为根的近似值。

程序设计步骤:1.给定x1,x2及精度要求.
2.计算c=(x1+x2)/2及f(x1),f(x2),f(c);
3.若x2-x1<0.0005,则返回主程序,x作为近似根,否则转4;
4.若f(c)f(x1)<0,则c=>x2,否则c=>x1;
5.继续循环2,直到满足条件为止。

即程序中的while判断语句。

VB 牛顿迭代法、二分法和弦截法解一元三次方程

VB 牛顿迭代法、二分法和弦截法解一元三次方程

VB 牛顿迭代法、二分法和弦截法解一元三次方程Option ExplicitPrivate a As Double, b As Double, c As Double, d As Double, xx1 As Double, xx2 As Double, e As DoublePrivate Sub Form_Load()a = 1 'a * x ^ 3 +b * x ^ 2 +c * x +d = 0b = 2c = 3d = -4xx1 = 0 '二分法区间或弦截法区间或牛顿迭代法初值xx2 = 1 '二分法区间或弦截法区间e = 0.00001 '精度End SubPrivate Sub Command1_Click() '牛顿迭代法Dim x As Double, y As Double, dy As Double, ydy As Double, i As Longx = xx1For i = 0 To 1000y = f(a, b, c, d, x)dy = f1(a, b, c, x)If Abs(y) < e ThenPrint "牛顿迭代法x = " & xPrint "迭代次数i = " & iPrintExit SubElseIf dy = 0 ThenPrint "失败,请另设初值试试"PrintExit SubEnd Ifydy = y / dyx = x - ydyNextPrint "失败!"PrintEnd SubPrivate Sub Command2_Click() '二分法Dim x1 As Double, x2 As Double, x0 As Double, y1 As Double, y2 As Double, y0 As Double, i As Longx1 = xx1x2 = xx2y1 = f(a, b, c, d, x1)y2 = f(a, b, c, d, x2)If (y1 > 0 And y2 > 0) Or (y1 < 0 And y2 < 0) ThenPrint "y1=" & y1 & " y2=" & y2 & ",二分法里y1与y2不能同号,请重新设置x1和x2"ElseIf y1 = 0 ThenPrint "二分法x = " & x1Print "迭代次数i = " & iElseIf y2 = 0 ThenPrint "二分法x = " & x2Print "迭代次数i = " & iElseFor i = 1 To 1000x0 = (x1 + x2) / 2'Debug.Print x0y0 = f(a, b, c, d, x0)If y0 = 0 ThenPrint "二分法x = " & x0Print "迭代次数i = " & iPrintExit SubElseIf Abs(x1 - x2) < e ThenPrint "二分法x = " & x0Print "迭代次数i = " & iPrintExit SubElseIf (y1 < 0 And y0 < 0) Or (y1 > 0 And y0 > 0) Thenx1 = x0Elsex2 = x0End IfNextPrint "失败!"End IfPrintEnd SubPrivate Sub Command3_Click() '弦截法Dim x1 As Double, x2 As Double, x0 As Double, y1 As Double, y2 As Double, y0 As Double, i As Longx1 = xx1x2 = xx2y1 = f(a, b, c, d, x1)y2 = f(a, b, c, d, x2)If (y1 > 0 And y2 > 0) Or (y1 < 0 And y2 < 0) ThenPrint "y1=" & y1 & " y2=" & y2 & ",二分法里y1与y2不能同号,请重新设置x1和x2"ElseIf y1 = 0 ThenPrint "弦截法x = " & x1Print "迭代次数i = " & iElseIf y2 = 0 ThenPrint "弦截法x = " & x2Print "迭代次数i = " & iElseFor i = 1 To 1000x0 = x1 - (x2 - x1) / (y2 - y1) * y1'Debug.Print x0y0 = f(a, b, c, d, x0)If y0 = 0 ThenPrint "弦截法x = " & x0Print "迭代次数i = " & iPrintExit SubElseIf Abs(x1 - x2) < e ThenPrint "弦截法x = " & x0Print "迭代次数i = " & iPrintExit SubElseIf (y1 < 0 And y0 < 0) Or (y1 > 0 And y0 > 0) Thenx1 = x0Elsex2 = x0End IfNextPrint "失败!"End IfPrintEnd SubFunction f(a As Double, b As Double, c As Double, d As Double, x As Double) As Doublef = a * x ^ 3 + b * x ^ 2 + c * x + dEnd FunctionFunction f1(a As Double, b As Double, c As Double, x As Double) As Double f1 = 3 * a * x ^ 2 + 2 * b * x + cEnd Function出师表两汉:诸葛亮先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

python求方程式的根_python计算方程式根的方法

python求方程式的根_python计算方程式根的方法

python求方程式的根_python计算方程式根的方法Python是一种高级编程语言,可以用来求解方程式的根。

Python提供了多种方法来计算方程式的根,包括数值方法和符号方法。

下面将介绍一些常用的方法。

1.数值方法:数值方法根据方程式的形式和计算要求选择不同的算法。

常见的算法有二分法、牛顿法和割线法。

1.1二分法:二分法是一种迭代的算法,通过不断缩小范围来逼近方程式的根。

二分法的基本思想是将区间一分为二,然后根据根的位置确定新的区间,并继续迭代直至满足设定的精度要求。

以下是使用二分法求解方程式根的示例代码:```pythondef bisection(f, a, b, epsilon):while (b - a) > epsilon:c=(a+b)/2if f(c) == 0:return celif f(a) * f(c) < 0:b=celse:a=creturn (a + b) / 2#方程式f(x)=x^2-1def f(x):return x ** 2 - 1#求解方程式的根root = bisection(f, -10, 10, 0.0001)print("方程式的根:", root)```1.2牛顿法:牛顿法是一种迭代的算法,通过不断逼近切线与x轴的交点来逼近方程式的根。

牛顿法的基本思想是利用方程式的导数近似计算根的位置,并通过不断迭代来逼近精确解。

以下是使用牛顿法求解方程式根的示例代码:```pythondef newton_raphson(f, f_prime, x0, epsilon):x=x0while abs(f(x)) > epsilon:x = x - f(x) / f_prime(x)return x#方程式f(x)=x^3-2x-5def f(x):return x ** 3 - 2 * x - 5#方程式的导数f'(x)=3x^2-2def f_prime(x):return 3 * x ** 2 - 2#求解方程式的根root = newton_raphson(f, f_prime, 3, 0.0001)print("方程式的根:", root)```1.3割线法:割线法是一种迭代的算法,通过不断逼近割线与x轴的交点来逼近方程式的根。

用二分法解一元三次方程的C++程序

用二分法解一元三次方程的C++程序
{
printf("input 2 numbers again:\n");
printf("x0=");
scanf("%lf",&x0);
printf("x1=");
scanf("%lf",&x1);
f0=x0*x0*x0+a[0]*x0*x0+a[1]*x0+a[2];
f1=x1*x1*x1+a[0]*x1*x1+a[1]*x1+a[2];
}
do
{
xm=(x0+x1)/2;
fm=xm*xm*xm+a[0]*xm*xm+a[1]*xm+a[2];
if(f0*fm>0)
x0=xm;
else
x1=xm;
}while(fabs(x0-x1)>1e-6);
r[i]=(x0+x1)/2;
printf("Ok, next!\n");
}//三次循环找三个根。
#include<stdio.h>
#include<math.h>
void main()
{
double x0,x1,xm,f0,f1,fm,x2,x3;//x2,x3是驻点,x0,x1,xm,f0,x1是二分法求根的工具。
double a[3],r[3];
inti,j=0;
printf("input 3 coefficients:\n");
printf("x0=");
scanf("%lf",&x0);

二分法程序清单

二分法程序清单

1、二分法程序清单:#include<stdio.h>#include<math.h>#include<conio.h>double f(double x){double y = 0;y = sin(x) - x*x/2;return y;}void main(){double a,b,y1,y2,temp;int e1,e2=1,n,i=0;printf("请输入根的区间:");scanf("%lf",&a);scanf("%lf",&b);y1=f(a);y2=f(b);if((y1*y2)<0){printf("要求小数点后的位数:");scanf("%d",&e1);while(e1>0){e2=e2*10;e1--;}n=(int)(log((b-a)*e2)/log(2));printf("对方程sinx-x2/2=0开始进行二分:\n");while(n>0){printf("第%d次二分结果:",i);temp=f((a+b)/2);if((f(a)*temp)<0){b=(a+b)/2;printf("a=%f,b=%f\n",a,b);}if((f(b)*temp)<0){a=(a+b)/2;printf("a=%f,b=%f\n",a,b);}n--;}}printf("方程的解是:%6.5f\n",(a+b)/2);}2、迭代法的求根程序清单:#include<stdio.h>#include<math.h>#include<conio.h>double f(double x){double y = 0;y = x*x*x-x-1;return y;}double fdao(double x){double a=1.0/3;return pow(x+1,a);}void main(){double x1,x2,a,b,e2=1;int i = 0,e1;printf("请输入根的区间:");scanf("%lf",&a);scanf("%lf",&b);if((f(a)*f(b))<0){printf("要求小数点后的位数:");scanf("%d",&e1);while(e1>0){e2=e2/10;e1--;}e2=e2/2;printf("e2=%f",e2);x1=a;printf("第%d次迭代后结果是:%20.19f\n",i,x1);x2=f(x1);while(fabs(x2-x1)>e2){printf("第%d次迭代后结果是:%20.19f\n",i,x2);x1=x2;x2=fdao(x1);}printf("共进行%d次迭代过程\n",i);printf("结果是:%20.19f\n",x2);}elseprintf("无法进行迭代!");}二分法:迭代法1拉格朗日插值#include<iostream>#include <iomanip>#include<math.h>using namespace std;float jisuanmokuai(int,float,float[],float[]);void main(){float a,x[50],y[50],l;int m,n;cout<<"题目:按下列数据"<<endl;cout<<"x:-3.0 -1.0 1.0 2.0 3.0"<<endl;cout<<"y:1.0 1.5 2.0 2.0 1.5"<<endl;cout<<"作二次插值,求x=-2,x=0,x=2.75时的函数近似值."<<endl;cout<<"输入插值次数:"<<endl;cin>>n;cout<<"输入计算次数:"<<endl;cin>>m;for(int i=0;i<=m;i++){for (int j=0;j<=n;j++){int h99=i+1,b99=j+1;cout<<"输入第"<<h99<<"个数的第"<<b99<<"个节点及函数值:"<<endl;cin>>x[j]>>y[j];}cout<<"输入要计算的x的值:"<<endl;cin>>a;l=jisuanmokuai(n,a,x,y);printf("%f\n",l);}}float jisuanmokuai(int n,float a,float x[],float y[]){float l=0,w;int i,j;for (i=0;i<=n;i++){w=1;for(j=0;j<=n;j++){if(i!=j)w=w*((a-x[j])/(x[i]-x[j]));}l=l+w*y[i];}return l;}2牛顿插值#include<iostream.h>void main (){double a,b;cout<<"please input a=";cin>>a;b=1.044303+0.33825*(a-0.3)+0.3969*(a-0.3)*(a-0.42)-0.1368*(a-0.3) *(a-0.42)*(a-0.50)-0.0275*(a-0.3)*(a-0.42)*(a-0.50)*(a-0.58) -0.5219*(a-0.3)*(a-0.42)*(a-0.50)*(a-0.58)*(a-0.66);cout<<"b="<<b<<endl;}1、Newton-Cotes求积分程序:#include<stdio.h>#include<conio.h>double NewtonCotes(double b[],double h);void main(){double y[5],I,a,b;int i;printf("请输入积分区间:");scanf("%lf",&a);scanf("%lf",&b);printf("请输入对应的函数值:\n");for(i=0;i<5;i++){scanf("%lf",&y[i]);}I=NewtonCotes(y,b-a);printf("利用Newton-Cotes积分公式求得函数)在(1.8,2.6)区间的积分值为:%6.5f\n",I);}double NewtonCotes(double y[],double h){double C;C=((y[0]+y[4])*7+(y[1]+y[3])*32+y[2]*12)*h/90;return C;}2、Romberg积分的程序清单:#include<iostream>#include<cmath>using namespace std;#define f(x) pow(x, 1.0 / 2)double Romberg(double a, double b);void main(){double a = 0.5, b = 1,jieguo;double real = 2.0 / 3 * (1 - pow(1.0 / 2, 3.0 / 2));printf("该积分的准确值是: %.17f\n\n", real);jieguo = Romberg(a, b);printf("由Romberg 公式计算后的积分值是: %.17f\n",jieguo); }double Romberg(double a, double b){int m, n;double h, x;double s, q;double jd,jingdu;double *y = new double[10];double p ;h = b - a;y[0] = h*(f(a) + f(b))/2.0;m = 1;n = 1;printf("请输入精度:");scanf("%lf",&jingdu);jd = jingdu + 1.0;while ((jd >= jingdu) && (m < 10)){p = 0.0;for (int i=0; i<n; i++){x = a + (i + 0.5) * h;p = p + f(x);}p = (y[0] + h*p)/2.0;s = 1.0;for (int k=1; k<=m; k++){s = 4.0*s;q = (s*p - y[k-1])/(s - 1.0);y[k-1] = p;p = q;}p = fabs(q - y[m-1]);m = m + 1;y[m-1] = q;n = n + n; h = h / 2.0;}return q;}1、高斯列主元消去法#include<stdio.h>void main(){float a[4][4]={{10,7,8,7},{7,5,6,5},{8,6,10,9},{7,5,9,10}}, y[4],c[4][4],x[4],d[4],m,b;int i,n,j,f;printf("请输入右端顶:\n");for (i=0;i<=3;i++)scanf("%f",&y[i]);for (n=0;n<=2;n++){m=a[n][n];f=n;for(i=(n+1);i<=3;i++){if(m<a[i][n]){m=a[i][n];f=i;}}if(f!=n){for(j=0;j<=3;j++){c[n][j]=a[n][j];a[n][j]=a[f][j];a[f][j]=c[n][j];}d[n]=y[n];y[n]=y[f];y[f]=d[n];}for(i=(n+1);i<=3;i++){b=-a[i][j]/a[n][n];for(j=0;j<=3;j++)a[i][j]=a[n][j]*b+a[i][j];y[i]=y[n]*b+y[i];}}x[3]=y[3]/a[3][3];x[2]=(y[2]-a[2][3]*x[3])/a[2][2];x[1]=(y[1]-a[1][3]*x[3]-a[1][2]*x[2])/a[1][1];x[0]=(y[0]-a[0][3]*x[3]-a[0][2]*x[2]-a[0][1]*x[1])/a[0][0];printf("x1的值为%f\nx2的值为%f\nx3的值为%f\nx4%f\n",x[0],x[1],x[2],x[3]);}2、直接三角分解法#define N 5#include<stdio.h>void main(){int i,j,r,k;float a[N][N],l[N][N],u[N][N],b[N],x[N],y[N];float de=0;printf("please imput the%d*%d matrix A:\n",N-1,N-1);for(i=1;i<N;i++)for(j=1;j<N;j++)scanf("%f",&a[i][j]);printf("please imput the l*%d matrix b:\n",N-1);for(j=1;j<N;j++)scanf("%f",&b[j]);for(j=1;j<N;j++){u[1][j]=a[1][j];l[j][1]=a[j][1]/u[1][1];}for(r=2;r<N;r++){for(j=r;j<N;j++){for(k=1;k<r;k++){de+=l[r][k]*u[k][j];}u[r][j]=a[r][j]-de;de=0;}for(i=r+1;r<N;r++){for(k=1;k<r;k++){de+=l[i][k]*u[k][r];}l[i][r]=a[i][r]-de;l[i][r]=l[i][r]/u[r][r];de=0;}}for(i=1;i<N;i++){l[i][i]=1;}y[1]=b[1];for(k=2;k<N;k++){de=0;for(j=1;j<k;j++)de+=l[k][j]*y[j];y[k]=b[k]-de;}x[N-1]=y[N-1]/u[N-1][N-1];for(k=N-2;k>=1;k--){de=0;for(j=k+1;j<=N-1;j++)de+=u[k][j]*x[j];x[k]=(y[k]-de)/u[k][k];}printf("The matrix x is:\n");for(j=1;j<N;j++)printf("x(%d)=%f\n",j,x[j]);}高斯列主元直接三角分解:欧拉法程序#include <stdio.h>#include <math.h>void main(){float h,y[11],y1[11],y2[11],y3[11],s[11],s2[11];int i,n;printf("x的范围是(0,1),请输入步长h的值:");scanf("%f",&h);printf("\n");y[0]=1;s[0]=1;s2[0]=1;n=1/h;printf("步长h为%f时:\nx的值 y的近似值 y的精确度\n",h);for(i=0;i<=n;i++){y1[i]=y[i]+i*h;y3[i+1]=y[i]+h*y1[i];y2[i+1]=y3[i+1]+h*(i+1);y[i+1]=y[i]+h/2*(y1[i]+y2[i+1]);s[i+1]=y[i+1];s2[i+1]=-h*(i+1)-1+2*exp(h*(i+1));printf("%f,%f,%f\n",h*(i+1),s[i+1],s2[i+1]);}}。

用区间二分法求方程的根

用区间二分法求方程的根

用区间二分法求方程的根一、前言1.了解区间二分法求解方程基本方法。

2.学习掌握区间二分法求解方程根的过程。

3.学习掌握MATLAB软件有关的命令。

二、参数说明function root=HalfInterval(f,a,b,eps)方程表达式:f区间左端点:a区间右端点:b根的精度:eps求得的根:root三、算法设计和运行结果1.算法设计①计算函数f(x)在区间[a,b]中点的函数值f((a+b)/2),并做下面的判断:如果f(a)f((a+b)/2)<0,转到②;如果f(a)f((a+b)/2)>0,令a=(a+b)/2,转到①;如果f(a)f((a+b)/2)=0,则x=(a+b)/2为一个根。

②如果|a-(a+b)/2|<p(预先给定的精度),则x=(b+3a)/4为一个根,否则令b=(a+b)/2,转到①。

2.运行结果r=HalfInterval('x^3-x-1',1,1.5)r =1.3247四、源程序及流程图源程序:function root=HalfInterval(f,a,b,eps)%方程表达式:f%区间左端点:a%区间右端点:b%根的精度:eps%求得的根:rootif (nargin==3)eps=1.0e-4;endf1=subs(sym(f),findsym(sym(f)),a); %两端点的函数值f2=subs(sym(f),findsym(sym(f)),b);if (f1==0)root=a;endif (f2==0)root=b;endif (f1*f2>0)disp('两端点函数值乘积大于0!');return;elseroot=FindRoots(f,a,b,eps); %调用求解子程序endfunction r=FindRoots(f,a,b,eps)f_1=subs(sym(f),findsym(sym(f)),a);f_2=subs(sym(f),findsym(sym(f)),b);mf=subs(sym(f),findsym(sym(f)),(a+b)/2); %中点函数值if (f_1*mf>0)t=(a+b)/2;r=FindRoots(f,t,b,eps); %右递归elseif (f_1*mf==0)r=(a+b)/2;elseif (abs(b-a)<=eps)r=(b+3*a)/4; %输出根elses=(a+b)/2;r=FindRoots(f,a,s,eps); %左递归endendend流程图:五、程序调试情况最终得出的结果是一个有效数字为四位的实根。

二分法解方程

二分法解方程

二分法解方程二分法解方程1.public function f(x as long) as longf=x^3-x*2-5end functionprivate sub command1_click()dim x0 as long, x1 as long,x2 as long,fm as long,fa as long,fb as long dox1=val(inputbox("请输入有根区点的左端点:","输入框",0))x2=val(inputbox("请输入有根区点的右端点:","输入框",0))f1=f(x1)f2=f(x2)loop until f1*f2<0dox0=(x1+x2)/2f0=f(x0)if f0=0 thenexit doelseif f0*f1<0 thenx2=x0:f2=f0elsex1=x0:f1=f0end ifend ifloop until abs(f0)<=0.00001label3.caption="方程的根是"& x0end sub2'x1=1x2=2c=0.005DOX=(X1+X2)/2f(x1)=x1^2-2f(x)=x^2-2IF f(x)=0 THENPRINT "方程根为:";xELSEIF f(x1)*f(x)<0 THENx2=xELSEx1=xEND IFEND IFLOOP UNTIL ABS(x1-x2)<=cPRINT "方程的近似根为:";xEND3'例:求f(x)=x*x*x-5*x+10=0 的根Function f(ByVal s As Double) As Doublef = s ^ 3 - 5 * s + 10 '原函数End Function'二分法'请使用默认值就可以,因为已经分析过Private Sub Command2_Click()Doa1 = InputBox("请输入查找区间最小值", "Input", "-10") a2 = InputBox("请输入查找区间最小值", "Input", "10")m1 = Val(a1)m2 = Val(a2)Loop While (f(m1) * f(m2) >= 0) '在值不相反时做此循环,否则返回值DoIf (f((m1 + m2) / 2) * f(m2) < 0) Then '如果值相反,说明根在(m1+m2)/2到m2间m1 = (m1 + m2) / 2Elsem2 = (m1 + m2) / 2 '反之,根在m1到(m1+m2)/2间End IfLoop While (f((m1 + m2) / 2) > 0.00001 Or f((m1 + m2) / 2) < -0.00001) '在规定范围内做循环Print (m1 + m2) / 2 '显示根'注意根与所取区间有关,但值相差很小End Sub ——————————————————————————————————————如果有什么疑问的话,可以直接提出来,大家一起解决吧。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VBA程序:二分法求方程的根
对于一般超越方程与高次代数方程求根的问题,可选用方法简单实用有效的不求导数的二分法,即在给定的寻根区间内,利用步步查找,二分缩小区间的方法,求出全部实根。

二分法求根程序框图见后附件。

主要标识符含义:
A,B—方程求根区间的左、右端点[a,b]
H—查根间距、跨步长度h
EPS—计算精度值,ε=
-
x A,y A—变化过程中的左端点点值及函数值
x B,Y B—变化过程中的右端点点值及函数值
x C,y C—变化过程中的中点点值及函数值
算例
已知方程式f(x)=x3-6x2+11x-6=0,求方程的根。

给定条件x∈[,],ε=,h=。

迭代求解后,可得到方程的三个实根:
x1=1
x2=2
x3=3
VBA程序代码
'声明方程求解给定的条件
Dim a As Double, b As Double, h As Double, eps As Double
'声明数组,用来放置根
Dim dblRoot() As Double
'统计根的个数
,
Dim lCount As Long
Sub Main()
Dim Xa As Double, Ya As Double, Xb As Double, Yb As Double
'赋初值
a =
b =

h =
eps =
Xa = a
Xb = a
Ya = dblFx(Xa)
Xb = Xb + h
If Xb > b Then Exit Sub
[
Yb = dblFx(Xb)
Call Root(Xa, Ya, Xb, Yb)
End Sub
Sub Root(Xa1 As Double, Ya1 As Double, Xb1 As Double, Yb1 As Double)
If qqqRoot(Ya1, Yb1) Then
%
Call qRoot(Xa1, Ya1, Xb1, Yb1)
Else
Xa1 = Xb1
Ya1 = Yb1
Xb1 = Xb1 + h
If Xb1 > b Then Exit Sub
Yb1 = dblFx(Xb1)
'符合求根条件则求根计算,否则继续调整求根区间
"
If qqqRoot(Ya1, Yb1) Then
Call qRoot(Xa1, Ya1, Xb1, Yb1)
Else
Call Root(Xa1, Ya1, Xb1, Yb1)
End If
End If
End Sub

'判断是否符合求根条件
Function qqqRoot(dblYa2 As Double, dblYb2 As Double) As Boolean
If dblYa2 * dblYb2 <= 0 Then
qqqRoot = True
Else
qqqRoot = False
End If
End Function

Sub qRoot(dblXa As Double, dblYa As Double, dblXb As Double, dblYb As Double) Dim dblXc As Double, dblYc As Double, dblXd As Double
'是否满足条件,不满足继续缩小求根区间
If Abs(dblYa - dblYb) > eps And Abs(dblXa - dblXb) > eps Then
dblXc = (dblXa + dblXb) / 2
dblYc = dblFx(dblXc)
Call qqRoot(dblXa, dblYa, dblXb, dblYb, dblXc, dblYc)
:
Else
'求得一个根
lCount = lCount + 1
dblXd = (dblXa + dblXb) / 2
'将所求根保存在数组中
ReDim Preserve dblRoot(1 To lCount)
dblRoot(lCount) = dblXd
'改变求根区间,以便获取下一个根
"
dblXa = dblXb
dblYa = dblYb
dblXb = dblXb + h
If dblXb > b Then Exit Sub
dblYb = dblFx(dblXb)
Call Root(dblXa, dblYa, dblXb, dblYb)
End If
End Sub

'判断并缩小求根区间
Sub qqRoot(dblXa1 As Double, dblYa1 As Double, dblXb1 As Double, dblYb1 As Double, dblXc1 As Double, dblYc1 As Double)
If dblYa1 * dblYc1 > 0 Then
dblXa1 = dblXc1
dblYa1 = dblYc1
Else
dblXb1 = dblXc1
@
dblYb1 = dblYc1
End If
Call qRoot(dblXa1, dblYa1, dblXb1, dblYb1)
End Sub
'要求根的方程式
Function dblFx(dblX As Double) As Double
dblFx = dblX * dblX * dblX - 6 * dblX * dblX + 11 * dblX - 6
End Function
'显示根
Sub DisplayRoot()
Dim i As Long
Dim str As String
lCount = 0
~
'调用求根程序
Main
'遍历并显示所求得的根
For i = LBound(dblRoot) To UBound(dblRoot)
str = str & "方程的第" & i & "根是:" & dblRoot(i) & Chr(10) Next i
MsgBox str
{
End Sub
参考资料:实用数值计算方法与程序
附:二分法求方程的根框图。

相关文档
最新文档