计算方法单点截弦matlab实现
2008-04-08 19:25
921 查看
function Dan(fun,a,b,e)
% 使用单点截弦法求方程 fun=0 在区间[x1,x2]处的根 e为误差限,默认为 eps
% 对于任意的 x 属于 [a,b] , diff(fun,x) 与 diff(fun,x,2) 连续且不变号
% 选择x0为不动点,xn为动点, 要求 fun(x_0)*diff(fun,x_0,2) > 0
% 其中迭代公式为 y=a-(x-a)/(fun(x)-fun(a))*fun(a)
% 作者:野渡无人
% 最后修改日期:2008.3.31
% Dan('x^3-2*x-5',2,3,10^(-5))
% n= 0 x0= 3.00000000000000000
% n= 1 x1= 2.00000000000000000
% n= 2 x2= 2.05882352941176450
% n= 3 x3= 2.08126365984502290
% n= 4 x4= 2.08963921009084740
% n= 5 x5= 2.09273957431800550
% n= 6 x6= 2.09388370846184820
% n= 7 x7= 2.09430545112525970
% n= 8 x8= 2.09446084576648770
% n= 9 x9= 2.09451809338575720
% n= 10 x10= 2.09453918229401690
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);
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为不动点,xn为动点, 要求 fun(x_0)*diff(fun,x_0,2) > 0
% 其中迭代公式为 y=a-(x-a)/(fun(x)-fun(a))*fun(a)
% 作者:野渡无人
% 最后修改日期:2008.3.31
% Dan('x^3-2*x-5',2,3,10^(-5))
% n= 0 x0= 3.00000000000000000
% n= 1 x1= 2.00000000000000000
% n= 2 x2= 2.05882352941176450
% n= 3 x3= 2.08126365984502290
% n= 4 x4= 2.08963921009084740
% n= 5 x5= 2.09273957431800550
% n= 6 x6= 2.09388370846184820
% n= 7 x7= 2.09430545112525970
% n= 8 x8= 2.09446084576648770
% n= 9 x9= 2.09451809338575720
% n= 10 x10= 2.09453918229401690
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);
x1=xn;
xn=x0-(x1-x0)/(subs(y,x1)-subs(y,x0))*subs(y,x0);
end
相关文章推荐
- 计算方法双点截弦法matlab实现
- 不用递归的方法计算米粒的个数和每个米粒的面积,matlab实现
- 计算方法中方程的近似解法中二分法matlab实现
- Matlab 实现 数值计算方法 二分法
- 用蒙特卡罗方法计算区域面积以matlab实现
- 基于MATLAB实现的云模型计算隶属度
- 计算一个文件的16位效验和——matlab语言的实现
- 多变量系统传递函数模型转换为状态空间模型的 MATLAB 实现方法
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- 数字图像处理之低通滤波器实现原理及方法(Matlab)
- 七种滤波方法的matlab实现和测试
- 设计Point类用来定义平面上的一个点,用构造方法传 递坐标位置,方法有计算两点的距离。编写测试类,在该类中实现Point类的对象。
- MATLAB中均值、方差、均方差的计算方法
- 三种方法实现Spark计算WordCount
- 三种方法实现Spark计算WordCount
- 三种方法实现Spark计算WordCount
- MATLAB与C++混合编程:动态链接库方法实现混合编程及常见错误解决办法
- 问题:C#根据生日计算属相;结果:C#实现根据年份计算生肖属相的方法
- 取得一个字符串表达式的计算结果(实现方法二)
- ip首部校验和的计算方法(c语言实现)