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;

}}

}