计算方法双点截弦法matlab实现
2008-04-08 19:31
791 查看
function Shuang(fun,a,b,e)
% 使用双点截弦法求方程 fun=0 在区间[x1,x2]处的根 e为误差限,默认为 eps
% 对于任意的 x 属于 [a,b] , diff(fun,x) 与 diff(fun,x,2) 连续且不变号
% 选择x0,x1均为动点
% 其中迭代公式为 x_n=x_0-(x_1-x_0)/(fun(x_1)-fun(x_0))*fun(x_0)
% 作者:野渡无人
% 最后修改日期:2008.3.31
% Shuang('x^3-2*x-5',2,3,10^(-9))
% n= 0 x0= 3.00000000000000000
% n= 1 x1= 2.00000000000000000
% n= 2 x2= 2.05882352941176450
% n= 3 x3= 2.09655863681924480
% n= 4 x4= 2.09451055355651850
% n= 5 x5= 2.09455143533096730
% n= 6 x6= 2.09455148154339140
if nargin==3
e=eps;
end
if a>=b
error('a>=b!请重新输入a,b值!');
end
if nargin<3
error('请正确输入至少三个参数!');
end
syms x y
y=fun; %定义符号函数,便于判断单点截弦法时隔根区间的要求以及初值的选定
y_diff=diff(y,x,1) ; % 函数的一阶导
y_diff2=diff(y,x,2) ;% 函数的二阶导
% 判断单点截弦法时隔根区间的要求,即:对于x属于[a,b],f(x)的一阶导以及二阶导应连续且不变号
for i=a:(b-a)/100:b
if sign(subs(y_diff,x,i))~=sign(subs(y_diff2,x,i))
error('对于x属于[a,b],f(x)的一阶导以及二阶导应连续且不变号!故所输入的参数有误!');
end
end
if sign(subs(y,x,a))==sign(subs(y_diff,x,a))
x0=a ; % a为初值x0
x1=b ; % b为x1
elseif sign(subs(y,x,b))==sign(subs(y_diff,x,b))
x0=b;
x1=a;
else
error('隔根区间端点不能作初值!');
end
format long;
n=0;
fprintf('n=%3d x%d= %12.17f /n',n,n,x0);
n=n+1;
fprintf('n=%3d x%d= %12.17f /n',n,n,x1);
xn=x0-(x1-x0)/(subs(y,x1)-subs(y,x0))*subs(y,x0);
while abs(xn-x1) > e
n=n+1;
fprintf('n=%3d x%d= %12.17f /n',n,n,xn);
x0=x1;
x1=xn;
xn=x0-(x1-x0)/(subs(y,x1)-subs(y,x0))*subs(y,x0);
end
% 使用双点截弦法求方程 fun=0 在区间[x1,x2]处的根 e为误差限,默认为 eps
% 对于任意的 x 属于 [a,b] , diff(fun,x) 与 diff(fun,x,2) 连续且不变号
% 选择x0,x1均为动点
% 其中迭代公式为 x_n=x_0-(x_1-x_0)/(fun(x_1)-fun(x_0))*fun(x_0)
% 作者:野渡无人
% 最后修改日期:2008.3.31
% Shuang('x^3-2*x-5',2,3,10^(-9))
% n= 0 x0= 3.00000000000000000
% n= 1 x1= 2.00000000000000000
% n= 2 x2= 2.05882352941176450
% n= 3 x3= 2.09655863681924480
% n= 4 x4= 2.09451055355651850
% n= 5 x5= 2.09455143533096730
% n= 6 x6= 2.09455148154339140
if nargin==3
e=eps;
end
if a>=b
error('a>=b!请重新输入a,b值!');
end
if nargin<3
error('请正确输入至少三个参数!');
end
syms x y
y=fun; %定义符号函数,便于判断单点截弦法时隔根区间的要求以及初值的选定
y_diff=diff(y,x,1) ; % 函数的一阶导
y_diff2=diff(y,x,2) ;% 函数的二阶导
% 判断单点截弦法时隔根区间的要求,即:对于x属于[a,b],f(x)的一阶导以及二阶导应连续且不变号
for i=a:(b-a)/100:b
if sign(subs(y_diff,x,i))~=sign(subs(y_diff2,x,i))
error('对于x属于[a,b],f(x)的一阶导以及二阶导应连续且不变号!故所输入的参数有误!');
end
end
if sign(subs(y,x,a))==sign(subs(y_diff,x,a))
x0=a ; % a为初值x0
x1=b ; % b为x1
elseif sign(subs(y,x,b))==sign(subs(y_diff,x,b))
x0=b;
x1=a;
else
error('隔根区间端点不能作初值!');
end
format long;
n=0;
fprintf('n=%3d x%d= %12.17f /n',n,n,x0);
n=n+1;
fprintf('n=%3d x%d= %12.17f /n',n,n,x1);
xn=x0-(x1-x0)/(subs(y,x1)-subs(y,x0))*subs(y,x0);
while abs(xn-x1) > e
n=n+1;
fprintf('n=%3d x%d= %12.17f /n',n,n,xn);
x0=x1;
x1=xn;
xn=x0-(x1-x0)/(subs(y,x1)-subs(y,x0))*subs(y,x0);
end
相关文章推荐
- 用蒙特卡罗方法计算区域面积以matlab实现
- Matlab 实现 数值计算方法 二分法
- 计算方法中方程的近似解法中二分法matlab实现
- 不用递归的方法计算米粒的个数和每个米粒的面积,matlab实现
- 计算方法单点截弦matlab实现
- 七种滤波方法的matlab实现和测试
- 在MATLAB中实现十进制和十六进制数的转化方法
- 利用算术(加减乘除)的方法实现从1到9计算等于100
- matlab实现共轭梯度法、多元牛顿法、broyden方法
- Java实现利用广度优先遍历(BFS)计算最短路径的方法
- Matlab实现数据的动态显示方法
- 使用MATLAB实现计算结果的图形表示
- 数值计算-线性方程组求解(1)-LU分解-MATLAB实现
- 蒙特卡洛方法 matlab 实现
- 利用算术(加减乘除)的方法实现从1到9计算等于100
- php实现周和月起止时间计算方法
- 话务量计算编程实现(MATLAB)
- MATLAB中均值、方差、均方差的计算方法
- 【matlab】:matlab如何实现计算三个点组成的角的角度值
- [推荐系统]mahout中实现的几种相似度计算方法