matlab二分法求方程的根举个简单例子
matlab二分法求方程的根
举个简单例子:
matlab二分法求方程的根举个简单例子
matlab二分法求方程的根举个简单例子
问题1:求f(x)=1-x-sinx=0在【0,1】的根 误不超过0.510^(-4)
解答:
clc;clear
a=0;b=1;
fa=1-a-sin(a);
fb=1-b-sin(b);
c=(a+b)/2;
fc=1-c-sin(c);
if fafb>0,break,end
while abs(fc)>0.510^(-4)
c=(a+b)/2;
fc=1-c-sin(c);
if fbfc>0
b=c;
fb=fc;
else
a=c;
fa=fc;
end
end
format long
fx=fc,x=c
结果:
fx =
-2.414986223420179e-005
x =
0.510986328100
问题2:用二分法求方程x^3-3x-1=0的根
解答:
先建立二分法的fun.m文件,代码如下:
function fun(a,b,e)
%f是自定义的函数
%a为隔根区间左端点,b为隔根区间右端点,e为误限
if nargin==2
e=1.0e-6;
elseif nargin<2
input('变量输入错误!');
return;
end
if a>=b
input('隔根区间输入错误!');
return;
end
a1=a;
b1=b;
c1=(a1+b1)/2;
n=0; %迭代计数器,初值为0
while (b-a)/(2^(n)) >= 1/2e
c1
if f(c1)==0
c1
elseif f(a1)f(c1)>0
a1=c1;
c1=(a1+b1)/2;
n=n+1;
elseif f(b1)f(c1)>0
b1=c1;
c1=(a1+b1)/2;
n=n+1;
end
end
n再建立所要求函数的f.m文件:
function y=f(x)
y=x^3-3x-1;
运行:fun(-100,100,10^(-4))
-100 100 为根所在该区间,10^(-4)表示精度要求。
结果:c1 =
c1 =
50
c1 =
25
c1 =
25/2
c1 =
25/4
c1 =
25/8
c1 =
25/16
c1 =
75/32
c1 =
125/64
c1 =
225/128
c1 =
475/256
c1 =
975/512
c1 =
1925/1024
c1 =
988/529
c1 =
2494/1331
c1 =
640/341
c1 =
1189/633
c1 =
171/
c1 =
1357/722
c1 =
109/58
c1 =
1013/539
c1 =
701/373
n =
22
后结果为 701/373
C语言表编程:用二分法求一元三次方程的根 要求:又主函数调用求根子函数
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)!
比如用二分法求f(x)=x^3-6x-1=0的实根。
代码如下(已调试):
#include "math.h"
main()
{float x,x1,x2;
float F(float x,float x1,float x2);
printf("请输入区间[x1,x2]n");
scanf("%f%f",&x1,&x2);
printf("x=%fn",F(x,x1,x2));
}float F(float x,float x1,float x2)
{float f,f1,f2;
do
{f1=pow(x1,3)-6x1-1.0;
f2=pow(x2,3)-6x2-1.0;
}while(f1f2>0); //确保输入的x1,x2使得f1,f2符号相反
do
{x=(x1+x2)/2; //求x1,x2的中点
f=pow(x,3)-6x-1.0;
if(f1f>0) //当f与f1符号相同时
{x1=x;f1=f;}
else if(f2f>0) //当f与f2符号相同时
{x2=x;f2=f;}
}while(fabs(f)>1e-6); //判断条件fabs(f)>1e-6的意思是f的值非常0
return x;
}输入:1 5
则输出:x=2.5288
输入:-10 10
则输出:x=2.5288
Matlab编写程序用二分法求解非线性方程的根
用二分法求方程xx-x-1=0的正根,要求到小数点后四位。(matlab)
l1
计算公式
f(ak)f(bk)<0;
bk-ak=1/2k-1(b-a);
a1<=a2<=…
<=ak<=…,b1<=b2<=…<=bk<=…。
l2
算法分析
设f(x)∈C[a,b],且f(a)f(b)<0,在[a,b]间寻找实根,记[a1,b1]=[a,b],取x1=(a1+b1)/2,若f(x1)=0,则x1是f(x)=0的根,f(x1)f(a1)>0,则a2=x1,b2=b1,否则a2=a1,b2=x1。得到[a2,b2]满足:f(a2)f(b2)<0,b2-a2=(b1-a1)/2=(b-a)/2,a2>=a1,b2<=b1。以[a2,b2]取代[a1,b1],继续以上过程,直到精度达到要求为止。
l3
源程序
function
f1=fun(x);
f1=x-cos(x);
function
[x,k]=erfen(a,b,s)
%a,b为根区间,s为精度
a=0;b=1;s=1e-4;k=0;
while
abs(a-b)>s
x=(a+b)/2;
if
fun(a)fun(x)<0
b=x;
else
a=x;
end
k=k+1;
end
x=(a+b)/2
%x为方程的解
k%
k为计算次数
实验结果讨论和分析
本题使用二分法得到的x=0.73,满足基本要求,题目要求到小数点后四位,告诉了本题二分法得应达到得度;计算次数为14,二分法收敛性很好,收敛速度不快。
已知方程X^3+X-4=0在区间[1,2]内有一根,用二分法求根,使其具有5位有效数字至少应二分多少次,求用C语言编
#include
#include
double fun(double x) { return x x x + x - 4; }
int num=0;
double root(double a, double b, double e)
{double x1, x2, y1, x, y;
x1 = a; x2 = b;
do {
x = (x1 + x2)/2;
y = fun(x);
y1 = fun(x1);
if( ( y < 0 && y1 < 0) || (y > 0 && y1 > 0) )
x1 = x;
else
x2 = x;
/end if/
num++;
}while(fabs(y) > e);
return x;
}int main(void)
{double x = root(1.0f, 2.0f, 1e-4);
printf("%.4f %dn", x,num);
return 0;
}/
运行结果:
1.3788 13
/
matlab二分法求方程的根
举个简单例子:
问题1:求f(x)=1-x-sinx=0在【0,1】的根 误不超过0.510^(-4)
解答:
clc;clear
a=0;b=1;
fa=1-a-sin(a);
fb=1-b-sin(b);
c=(a+b)/2;
fc=1-c-sin(c);
if fafb>0,break,end
while abs(fc)>0.510^(-4)
c=(a+b)/2;
fc=1-c-sin(c);
if fbfc>0
b=c;
fb=fc;
else
a=c;
fa=fc;
end
end
format long
fx=fc,x=c
结果:
fx =
-2.414986223420179e-005
x =
0.510986328100
问题2:用二分法求方程x^3-3x-1=0的根
解答:
先建立二分法的fun.m文件,代码如下:
function fun(a,b,e)
%f是自定义的函数
%a为隔根区间左端点,b为隔根区间右端点,e为误限
if nargin==2
e=1.0e-6;
elseif nargin<2
input('变量输入错误!');
return;
end
if a>=b
input('隔根区间输入错误!');
return;
end
a1=a;
b1=b;
c1=(a1+b1)/2;
n=0; %迭代计数器,初值为0
while (b-a)/(2^(n)) >= 1/2e
c1
if f(c1)==0
c1
elseif f(a1)f(c1)>0
a1=c1;
c1=(a1+b1)/2;
n=n+1;
elseif f(b1)f(c1)>0
b1=c1;
c1=(a1+b1)/2;
n=n+1;
end
end
n再建立所要求函数的f.m文件:
function y=f(x)
y=x^3-3x-1;
运行:fun(-100,100,10^(-4))
-100 100 为根所在该区间,10^(-4)表示精度要求。
结果:c1 =
c1 =
50
c1 =
25
c1 =
25/2
c1 =
25/4
c1 =
25/8
c1 =
25/16
c1 =
75/32
c1 =
125/64
c1 =
225/128
c1 =
475/256
c1 =
975/512
c1 =
1925/1024
c1 =
988/529
c1 =
2494/1331
c1 =
640/341
c1 =
1189/633
c1 =
171/
c1 =
1357/722
c1 =
109/58
c1 =
1013/539
c1 =
701/373
n =
22
后结果为 701/373
求用c语言编写一个函数二分法求根的算法
二分法计算函数f(x)=xxxx+2xxx-x-1;
本程序在turbo
c或c++下编译
#include
"stdio.h"
#include
float
f(float
x)
{float
y;
y=xxxx+2xxx-x-1;
return
y;
}void
main()
{float
a=0,b=0,h,y,x;
int
k,n0;
printf("please
input
qujian
aand
b");
scanf("%f%f%d",&a,&b,&n0);
/输入含根区间a,b,循环次数n0
/
for(k=0;k<=n0;k++)
{x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{printf("k=%d,x=%f,y=%f",k,x,y);
break;
}/输出分半次数k,函数的根x,及x对应的函数值./
else
{if(f(a)f(x)<0)
b=x;
else
a=x;
}}
}
二分法计算函数f(x)=xxxx+2xxx-x-1;
本程序在turbo
c或c++下编译
#include
"stdio.h"
#include
float
f(float
x)
{float
y;
y=xxxx+2xxx-x-1;
return
y;
}void
main()
{float
a=0,b=0,h,y,x;
int
k,n0;
printf("please
input
qujian
aand
b");
scanf("%f%f%d",&a,&b,&n0);
/输入含根区间a,b,循环次数n0
/
for(k=0;k<=n0;k++)
{x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{printf("k=%d,x=%f,y=%f",k,x,y);
break;
}/输出分半次数k,函数的根x,及x对应的函数值./
else
{if(f(a)f(x)<0)
b=x;
else
a=x;
}}
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。