大家好,又见面了,我是你们的朋友全栈君。
本篇是在课程学习中自己编程实现的二分法计算非线性方程或者超越方程近似根的算法,写一下,后边便于复习和期末课程设计引用。
% 二分法求根的matlab算法
function [x0,n]=dichotomy(a,b,err,f_x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%输入参数a为根的区间左端点 %
%输入参数b为根的区间右端点 %
%输入参数err为误差精度 %
% 输入参数f_x为待求根函数 %
%输出参数x0为满足精度要求的根 %
% 输出参数n为迭代的次数 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=ceil((log((b-a)./err)./log(2)-1));%求迭代次数
while(sign(f_x(a))==0)%如果a的函数值为0停止迭代输出x0为a的值,迭代次数为0
x0=a;
n=0;
return;
end
while(sign(f_x(b))==0)%如果b的函数值为0停止迭代输出x0为b的值,迭代次数为0
x0=b;
n=0;
return;
end
while(sign(f_x(a))~=sign(f_x(b)))%a、b符号不同进行区间二分
x0=a/2+b/2; %区间中点
if(sign(f_x(a))~=sign(f_x(x0)))%判断区间中点函数值与区间端点符号
b=x0; %将中点赋值给符号相同的端点
if(b-a<=err||abs(f_x(x0))<=err)%判断是否满足精度要求
x0=a/2+b/2;
return;
else %不满足精度循环调用二分法
dichotomy(a,b,err,f_x);
end
else
a=x0; %将中点赋值给符号相同的端点
if(b-a<=err||abs(f_x(x0))<=err)%判断是否满足精度要求
x0=a/2+b/2;
return;
else %不满足精度循环调用二分法
dichotomy(a,b,err,f_x);
end
end
end
引用实列:求解函数f(x)=x^3-x-1在区间[1,1.5]上的一个零点,误差不超过0.005 f=@(x)x^3-x-1 [x0,n]=dichotomy(1,1.5,0.005,f) 结果
转载请注明出处!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128074.html原文链接:https://javaforall.cn