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

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
参考资料:实用数值计算方法与程序
附:二分法求方程的根框图。

合集下载

实验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

《数值分析》实验报告实验三 非线性方程求根一、实验目的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判断语句。

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