matlab编程题:用二分法求方程x^3-3*x-1=0的根

欢迎高人答题~~... 欢迎高人答题~~ 展开
 我来答
百度网友5af39a9
推荐于2017-10-01 · 超过35用户采纳过TA的回答
知道答主
回答量:101
采纳率:0%
帮助的人:87.6万
展开全部
先建立二分法的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/2*e
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-3*x-1;

运行:fun(-100,100,10^(-4))
-100 100 为根所在该区间,10^(-4)表示精度要求。

结果:c1 =
0
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/91
c1 =
1357/722
c1 =
109/58
c1 =
1013/539
c1 =
701/373
n =
22

最后结果为 701/373

欢迎指错。
渠玉宇焉珧
2020-01-10 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:28%
帮助的人:584万
展开全部
function
[x,k]=demimethod(a,b,f,emg)
%
a,b
:求解区间的两个端点
%
f
:所求方程的函数名
%
emg
:精度指标
%
x:所求近似解
%
k:
循环次数
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=0;
while
abs(b-a)>emg
if
fab==0
x=(a+b)/2;
return;
elseif
fa*fab<0
b=(a+b)/2;
else
a=(a+b)/2;
end
fa=feval(f,a);
%feval就是计算了x=a情况下,f的函数值,单纯求解题中方程,则函数可以少个参量f,这里fa=表达式带入值就行了
fab=feval(f,(a+b)/2);
k=k+1;
end
x=(a+b)/2;
本来想查下二分法,结果找到
回答者:
2008zhenghui
-
六级
高人的回答,看着不错,就引用哈,小弟混分而已,望见谅
输入会有相应结果
>>
f=@(x)x^3-3*x-1;
>>
demimethod(-5,5,f,10^(-8))
ans
=
1.8794
实验无误,问题是二分法虽然能解近似解,但还是要配合图形,输入相应区间,如果区间过广,会漏解
>>
solve('x^3-3*x-1')
ans
=
1/((3^(1/2)*i)/2
+
1/2)^(1/3)
+
((3^(1/2)*i)/2
+
1/2)^(1/3)
-
1/(2*((3^(1/2)*i)/2
+
1/2)^(1/3))
-
((3^(1/2)*i)/2
+
1/2)^(1/3)/2
-
(3^(1/2)*i*(1/((3^(1/2)*i)/2
+
1/2)^(1/3)
-
(1/2*3^(1/2)*i
+
1/2)^(1/3)))/2
(3^(1/2)*i*(1/((3^(1/2)*i)/2
+
1/2)^(1/3)
-
(1/2*3^(1/2)*i
+
1/2)^(1/3)))/2
-
((3^(1/2)*i)/2
+
1/2)^(1/3)/2
-
1/(2*((3^(1/2)*i)/2
+
1/2)^(1/3))
>>
1/((3^(1/2)*i)/2
+
1/2)^(1/3)
+
((3^(1/2)*i)/2
+
1/2)^(1/3)
-
1/(2*((3^(1/2)*i)/2
+
1/2)^(1/3))
-
((3^(1/2)*i)/2
+
1/2)^(1/3)/2
-
(3^(1/2)*i*(1/((3^(1/2)*i)/2
+
1/2)^(1/3)
-
(1/2*3^(1/2)*i
+
1/2)^(1/3)))/2
(3^(1/2)*i*(1/((3^(1/2)*i)/2
+
1/2)^(1/3)
-
(1/2*3^(1/2)*i
+
1/2)^(1/3)))/2
-
((3^(1/2)*i)/2
+
1/2)^(1/3)/2
-
1/(2*((3^(1/2)*i)/2
+
1/2)^(1/3))
ans
=
1.8794
-
0.0000i
ans
=
-1.5321
+
0.0000i
ans
=
-0.3473
+
0.0000i
上面的-5到5的区间就漏解下面情况
>>
demimethod(-3,-1,f,10^(-8))
ans
=
-1.5321
>>
demimethod(-1,0,f,10^(-8))
ans
=
-0.3473
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
曲水洛桑Cf
2010-05-11 · TA获得超过248个赞
知道答主
回答量:88
采纳率:0%
帮助的人:0
展开全部
function [x,k]=demimethod(a,b,f,emg)
% a,b :求解区间的两个端点
% f :所求方程的函数名
% emg :精度指标
% x:所求近似解
% k: 循环次数
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=0;
while abs(b-a)>emg
if fab==0
x=(a+b)/2;
return;
elseif fa*fab<0
b=(a+b)/2;
else
a=(a+b)/2;
end
fa=feval(f,a); %feval就是计算了x=a情况下,f的函数值,单纯求解题中方程,则函数可以少个参量f,这里fa=表达式带入值就行了
fab=feval(f,(a+b)/2);
k=k+1;
end
x=(a+b)/2;

本来想查下二分法,结果找到 回答者: 2008zhenghui - 六级 高人的回答,看着不错,就引用哈,小弟混分而已,望见谅
输入会有相应结果
>> f=@(x)x^3-3*x-1;
>> demimethod(-5,5,f,10^(-8))

ans =

1.8794

实验无误,问题是二分法虽然能解近似解,但还是要配合图形,输入相应区间,如果区间过广,会漏解
>> solve('x^3-3*x-1')

ans =

1/((3^(1/2)*i)/2 + 1/2)^(1/3) + ((3^(1/2)*i)/2 + 1/2)^(1/3)
- 1/(2*((3^(1/2)*i)/2 + 1/2)^(1/3)) - ((3^(1/2)*i)/2 + 1/2)^(1/3)/2 - (3^(1/2)*i*(1/((3^(1/2)*i)/2 + 1/2)^(1/3) - (1/2*3^(1/2)*i + 1/2)^(1/3)))/2
(3^(1/2)*i*(1/((3^(1/2)*i)/2 + 1/2)^(1/3) - (1/2*3^(1/2)*i + 1/2)^(1/3)))/2 - ((3^(1/2)*i)/2 + 1/2)^(1/3)/2 - 1/(2*((3^(1/2)*i)/2 + 1/2)^(1/3))

>> 1/((3^(1/2)*i)/2 + 1/2)^(1/3) + ((3^(1/2)*i)/2 + 1/2)^(1/3)
- 1/(2*((3^(1/2)*i)/2 + 1/2)^(1/3)) - ((3^(1/2)*i)/2 + 1/2)^(1/3)/2 - (3^(1/2)*i*(1/((3^(1/2)*i)/2 + 1/2)^(1/3) - (1/2*3^(1/2)*i + 1/2)^(1/3)))/2
(3^(1/2)*i*(1/((3^(1/2)*i)/2 + 1/2)^(1/3) - (1/2*3^(1/2)*i + 1/2)^(1/3)))/2 - ((3^(1/2)*i)/2 + 1/2)^(1/3)/2 - 1/(2*((3^(1/2)*i)/2 + 1/2)^(1/3))

ans =

1.8794 - 0.0000i

ans =

-1.5321 + 0.0000i

ans =

-0.3473 + 0.0000i

上面的-5到5的区间就漏解下面情况
>> demimethod(-3,-1,f,10^(-8))

ans =

-1.5321

>> demimethod(-1,0,f,10^(-8))

ans =

-0.3473
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
开妙晴力皓
2019-04-14 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:26%
帮助的人:930万
展开全部
先建立二分法的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/2*e
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-3*x-1;
运行:fun(-100,100,10^(-4))
-100
100
为根所在该区间,10^(-4)表示精度要求。
结果:c1
=
0
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/91
c1
=
1357/722
c1
=
109/58
c1
=
1013/539
c1
=
701/373
n
=
22
最后结果为
701/373
欢迎指错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式