急需MATLAB二分法求方程求求方程f(x)=x^3-sin(x)-12*x+1的全部实根,ε=10^-6程序 5
2个回答
展开全部
function main
%f(x)=x3-sinx-12x+1的全部实根,ε=10-6。
x=-5:.1:5;
f=x.^3-sin(x)-12*x+1;
plot(x,f);grid on;
%http://hi.baidu.com/jingtao1016/album/item/123a761352492fc6f6039e38.html
%可以看出在实数范围(-4,-3),(0,1),(3,4)这三个区间均有根
y=inline('t^3-sin(t)-12*t+1','t');
x1=bisect(y,-4,-3,1e-6)
x2=bisect(y,0,1,1e-6)
x3=bisect(y,3,4,1e-6)
function x=bisect(fname,a,b,e)
%用途:二分法求非线性方程f(x)=0的解
%调用格式:x=bisect(fname,a,b,e)
%fname为调用函数句柄或内嵌函数表达的f(x)
%a,b为区间端点;e为精度(默认值10^-4),
%x返回解而且只能返回一个解,不管给定的区间内有多少个零点
%程序要求函数在两端点值必须异号
%fa,fb,fx引入可以最大限度减少fname调用次数,从而提高速度
if nargin<4
e=1e-4;
end
fa=feval(fname,a);fb=feval(fname,b);
if fa*fb>0
error('函数在两端点值必须异号');
end
x=(a+b)/2;
while(b-a)>(2*e)
fx=feval(fname,x);
if fa*fx<0
b=x;fb=fx;
else a=x;fa=fx;
end
x=(a+b)/2;
end
x1 =
-3.4912
x2 =
0.0770
x3 =
3.4101
%f(x)=x3-sinx-12x+1的全部实根,ε=10-6。
x=-5:.1:5;
f=x.^3-sin(x)-12*x+1;
plot(x,f);grid on;
%http://hi.baidu.com/jingtao1016/album/item/123a761352492fc6f6039e38.html
%可以看出在实数范围(-4,-3),(0,1),(3,4)这三个区间均有根
y=inline('t^3-sin(t)-12*t+1','t');
x1=bisect(y,-4,-3,1e-6)
x2=bisect(y,0,1,1e-6)
x3=bisect(y,3,4,1e-6)
function x=bisect(fname,a,b,e)
%用途:二分法求非线性方程f(x)=0的解
%调用格式:x=bisect(fname,a,b,e)
%fname为调用函数句柄或内嵌函数表达的f(x)
%a,b为区间端点;e为精度(默认值10^-4),
%x返回解而且只能返回一个解,不管给定的区间内有多少个零点
%程序要求函数在两端点值必须异号
%fa,fb,fx引入可以最大限度减少fname调用次数,从而提高速度
if nargin<4
e=1e-4;
end
fa=feval(fname,a);fb=feval(fname,b);
if fa*fb>0
error('函数在两端点值必须异号');
end
x=(a+b)/2;
while(b-a)>(2*e)
fx=feval(fname,x);
if fa*fx<0
b=x;fb=fx;
else a=x;fa=fx;
end
x=(a+b)/2;
end
x1 =
-3.4912
x2 =
0.0770
x3 =
3.4101
展开全部
在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=zhidao_fx(x)
y=x.^3-sin(x)-12*x+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function x=findroot2(fx,x0,x1)
e=1e-6;
y0=eval([fx,'(x0)']);
y1=eval([fx,'(x1)']);
x=(x0+x1)/2;
y=eval([fx,'(x)']);
if (abs(x0-x1)<1e-6) return, end
if (y0*y<=0)
x=findroot2(fx,x0,x);
else
x=findroot2(fx,x,x1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在Matlab命令窗口下输入以下命令
%%注:本命令只找出x0到x1之间的根,dx太大有可能出现漏解情况
x0=-5;
x1=5;
dx=0.5;
x=x0:dx:x1;
y=zhidao_fx(x);
n=length(x);
count=0;
root=[];
for i=1:n-1
if (y(i)*y(i+1)<0)
count=count+1;
root(count)=findroot2('zhidao_fx',x(i),x(i+1));
end
end
root
plot(x,y,root,zeros(size(root)),'r*') %检验部分,红点为解
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function y=zhidao_fx(x)
y=x.^3-sin(x)-12*x+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function x=findroot2(fx,x0,x1)
e=1e-6;
y0=eval([fx,'(x0)']);
y1=eval([fx,'(x1)']);
x=(x0+x1)/2;
y=eval([fx,'(x)']);
if (abs(x0-x1)<1e-6) return, end
if (y0*y<=0)
x=findroot2(fx,x0,x);
else
x=findroot2(fx,x,x1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在Matlab命令窗口下输入以下命令
%%注:本命令只找出x0到x1之间的根,dx太大有可能出现漏解情况
x0=-5;
x1=5;
dx=0.5;
x=x0:dx:x1;
y=zhidao_fx(x);
n=length(x);
count=0;
root=[];
for i=1:n-1
if (y(i)*y(i+1)<0)
count=count+1;
root(count)=findroot2('zhidao_fx',x(i),x(i+1));
end
end
root
plot(x,y,root,zeros(size(root)),'r*') %检验部分,红点为解
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询