VBA程序:二分法求方程的根
实验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,遂将过程详细记录之。
图中标注①是⼯作⽬录,即代码存放的⽬录;标注②是编辑器,即我们写代码的地⽅;标注③是命令⾏,是我们执⾏语句的地⽅。
本次实验我们是在这⾥执⾏⼆分法的函数。
例题:应⽤⼆分法求解⽅程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中,我们可以使用二分法求根的函数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程序:二分法求方程的根对于一般超越方程与高次代数方程求根的问题,可选用方法简单实用有效的不求导数的二分法,即在给定的寻根区间内,利用步步查找,二分缩小区间的方法,求出全部实根。
二分法求根程序框图见后附件。
主要标识符含义: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

《数值分析》实验报告实验三 非线性方程求根一、实验目的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 二分法求解非线性方程的根计机系 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 牛顿迭代法、二分法和弦截法解一元三次方程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提供了多种方法来计算方程式的根,包括数值方法和符号方法。
下面将介绍一些常用的方法。
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++程序

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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
参考资料:实用数值计算方法与程序
附:二分法求方程的根框图。