方程求根——二分法

二分法求根主要应用了区间套定理,这一算法实现简单且结果也迭代的较好,但对于复杂函数其结果不理想

  1.代码

%%二分法求根
%%f为函数表达式,interval0为初始区间,epsilon为控制精度
function RD = Roots_dichotomy(f,interval0,epsilon)
x_low = interval0(1);x_up = interval0(2);x_ave = (x_low+x_up)/2;

%%作图
t = x_low:(x_up-x_low)/1000:x_up;
T = subs(f,t);
y0 = zeros(1,max(size(t)));
h=figure;
set(h,‘color‘,‘w‘);
plot(t,T,‘r‘,t,y0,‘b‘);
grid on
legend(‘T:函数图像‘,‘y0:y = 0‘);
xlabel(‘x shaft‘);ylabel(‘y shaft‘);
title(‘函数图像‘);
syms x;

%%限定实数解及只在区间中的实数解出现在图象上
X_real = double(solve([f],[0]));
for i = 1:max(size(X_real))
    if isreal(X_real(i)) == 1
        x_real(i) = X_real(i);
    else
        x_real(i) =0;
    end
end
x_real(x_real==0)=[];
for i = 1:max(size(x_real))
    text(x_real(i),0,[‘(‘,num2str(x_real(i)),‘,‘,num2str(0),‘)‘],‘color‘,[0.02 0.79 0.99]);
end

f_low = subs(f,x_low);f_up = subs(f,x_up);
ub = 100;e=floor(abs(log(epsilon)));
X_up(1) = x_up;X_low(1) = x_low;X_ave(1) = x_ave;
if f_low*f_up > 0
    disp(‘请修改区间!‘);
    interval0 = input(‘输入区间为:‘);
    RD = Roots_dichotomy(f,interval0,epsilon);
else
    %%二分算法
    for i = 1:1:ub
        f_low = subs(f,x_low);
        f_up = subs(f,x_up);
        f_ave = subs(f,x_ave);
        if f_low*f_ave <0
            x_up = x_ave;
            x_ave = (x_low+x_up)/2;
        elseif f_ave*f_up < 0
            x_low = x_ave;
            x_ave = (x_low+x_up)/2;
        end
        delta = x_up -x_low;
        X_up(i+1) = x_up;X_low(i+1) = x_low;X_ave(i+1) = x_ave;
        if abs(delta) < epsilon
            break;
        end
    end
    disp(‘迭代次数为‘);
    i
    disp(‘输出结果依次是下界迭代值,中值迭代值,上界迭代值‘);
    RD = vpa([X_low;X_ave;X_up],e);
end
end

  2.例子

clear all
clc
syms x;
f = x^3+log(x);
epsilon=1e-6;
interval0 = [0.1,1];

%%二分法
Y = Roots_dichotomy(f,interval0,epsilon)

  结果如下

迭代次数为
i =
    20
输出结果依次是下界迭代值,中值迭代值,上界迭代值
Y =
[  0.1,  0.55,   0.55,  0.6625,   0.6625,  0.690625,  0.7046875,   0.7046875,    0.7046875,     0.7046875,      0.7046875,       0.7046875,       0.7046875,       0.7046875,       0.7046875,       0.7046875, 0.7047012329102, 0.7047080993652, 0.7047080993652, 0.7047080993652, 0.7047089576721]
[ 0.55, 0.775, 0.6625, 0.71875, 0.690625, 0.7046875, 0.71171875, 0.708203125, 0.7064453125, 0.70556640625, 0.705126953125, 0.7049072265625, 0.7047973632812, 0.7047424316406, 0.7047149658203, 0.7047012329102, 0.7047080993652, 0.7047115325928,  0.704709815979, 0.7047089576721, 0.7047093868256]
[  1.0,   1.0,  0.775,   0.775,  0.71875,   0.71875,    0.71875,  0.71171875,  0.708203125,  0.7064453125,  0.70556640625,  0.705126953125, 0.7049072265625, 0.7047973632812, 0.7047424316406, 0.7047149658203, 0.7047149658203, 0.7047149658203, 0.7047115325928,  0.704709815979,  0.704709815979]

  

原文地址:https://www.cnblogs.com/guliangt/p/12119198.html

时间: 2024-10-21 12:45:45

方程求根——二分法的相关文章

关于方程求根的解决方案

对于方程求根主要的思想主要采取迭代的思想,通过条件判断,循环执行直到满足条件以后直接跳出循环输出 下面以x-cos(x)=0:为例  采用do-while 循环,输出Root: #include "stdio.h"#include "math.h"#include "stdio.h"double fun(){ double x1=0,x0; do { x0=x1; x1=cos(x0); } while(fabs(x0-x1)>=1e-6)

方程求根——牛顿迭代法

这段代码实现了牛顿切线法.简化牛顿法和牛顿下山法这三种方程求解法,由于输出结果较长,只以牛顿下山法为例写一段例题 1.代码 %%牛顿迭代法 %%method为-1时为牛顿切线法,method为0时为简化牛顿法,method为1时为牛顿下山法 %%f是表达式f(x) = 0,X0是初值,epsilon是精度,interval是包含解的区间 function NM = Newton_method(f,X0,epsilon,interval,method) Y0 = subs(f,X0); %%作图

方程求根

一. 二分法 题目:用二分法求方程x3-2x-5=0在区间[2,3]内的一个实根,要求误差不超过0.01. 1 #include <iostream> 2 using namespace std; 3 4 double f(double x) 5 { 6 return x*x*x - 2*x - 5; 7 } 8 9 int main() 10 { 11 double left = 2.0, right = 3.0; 12 double mid; 13 while(right - left &

方程求根——两种加速迭代法

这段代码实现了埃特金加速迭代法和斯特芬森加速迭代法,我们以斯特粉森迭代为例 1.代码 %%注意,这里的fei不再是形如f(x)=0的形式而是x=fei(x)的形式,有些fei(x)不收敛,需要寻找,X0是初始值,method取值0和1代表上述两种方法 function AIM = Accelerated_iteration_method(fei,X0,epsilon,method) %%作图 t = X0/2:X0/1000:2*X0; T = subs(fei,t); y0 = t; h=fi

链表实现二分法求根

#include<iostream>#include<iomanip>#include<cmath>using namespace std;class poly{public: double c; int e; poly*next;};poly*input();double f(poly*head,double x);double root(poly*head,double a, double b);int main(){ poly*head; double a, b;

OJ刷题之《求方程的根》

题目描述 求方程 的根,用三个函数分别求当b^2-4ac大于0.等于0.和小于0时的根,并输出结果.从主函数输入a.b.c的值. 输入 a b c 输出 x1=? x2=? 样例输入 4 1 1 样例输出 x1=-0.125+0.484i x2=-0.125-0.484i 提示 主函数已给定如下,提交时不需要包含下述主函数 /*  C代码或C++代码   */ int main() { float a,b,c,q; void shigen(float,float,float); void den

谭浩强 C程序设计 8.2 求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。

#include<stdio.h> #include<math.h> int main() { float a,b,c,q; void lianggegen(float a,float b,float q); void dangen(float a,float b,float q); void fushugen(float a,float b,float q); printf("输入 a b c 的值,以空格分隔:\n "); scanf("%f%f%

R语言求根

求根是数值计算的一个基本问题,一般采用的都是迭代算法求解,主要有不动点迭代法.牛顿-拉富生算法.割线法和二分法. 不动点迭代法 所谓的不动点是指x=f(x)的那些点,而所谓的不懂点迭代法是指将原方程化为x=f(x)形式之后,下一步所用的x值为这一步的f(x),这样的话就可以一直逼近我们需         要的x,即方程的根,但是这种方法可能不会收敛到方程的根,随着初始值选定的大小,可能会有发散的情况,因此需要谨慎使用. ###不动点迭代法 func1 <- function(x){return(

OJ刷题之《牛顿迭代法求根》

题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附近的一个实根.求出根后由主函数输出.结果保留两位小数. 输入 系数a,b,c,d的值 输出 x在1附近的一个实根 样例输入 1 2 3 4 样例输出 -1.65 提示 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { double solut(double ,double ,double ,double ); double