精华内容
下载资源
问答
  • 牛顿法和弦截法求方程根的C++程序,很好的实现迭代求根
  • 弦截法求方程根

    2015-07-16 14:20:00
    弦截法求方程在[a, b]区间的 33 { 34 double x, y, y1; 35 y1 = f(a); 36 do { 37 x = point(a, b); // 求交点x坐标 38 y = f(x); // 求y 39 if (y*y1 > 0 ) 40 y1 = y, a = x; ...

    THE SECANT METHOD

    In numerical analysis, the secant method is a root-finding algorithm that uses a succession of roots of secant lines to better approximate a root of a function f. The secant method can be thought of as a finite difference approximation of Newton's method. However, the method was developed independently of Newton's method, and predated the latter by over 3,000 years.

     1 /*
     2  * =====================================================================================
     3  *
     4  *       Filename:  secant_method.cc
     5  *
     6  *    Description:  secant method
     7  *
     8  *        Version:  1.0
     9  *        Created:  2015年07月16日 13时53分26秒
    10  *       Revision:  none
    11  *       Compiler:  g++
    12  *
    13  *         Author:  YOUR NAME (), 
    14  *   Organization:  
    15  *
    16  * =====================================================================================
    17  */
    18 #include <iostream>
    19 #include <cmath>
    20 using namespace std;
    21 
    22 double f(double x)                              //所要求解的函数公式
    23 {
    24     return x*x*x - 3*x -1;
    25 }
    26 
    27 double point(double a, double b)                //求解弦与x轴的交点
    28 {
    29     return (a*f(b) - b*f(a))/(f(b) - f(a));
    30 }
    31 
    32 double root(double a, double b)                 //用弦截法求方程在[a, b]区间的根
    33 {
    34     double x, y, y1;
    35     y1 = f(a);
    36     do {
    37         x = point(a, b);                        //求交点x坐标
    38         y = f(x);                               //求y
    39         if (y*y1 > 0)
    40             y1 = y, a = x;
    41         else
    42             b = x;
    43     }while (fabs(y) >= 0.000001);               //计算精密度
    44     return x;
    45 }
    46 
    47 int main()
    48 {
    49     double a, b;
    50     cin>>a>>b;
    51     cout<<"root = "<<root(a, b)<<endl;
    52     return 0;
    53 }

     

    转载于:https://www.cnblogs.com/berthua/p/4651201.html

    展开全文
  • 用C语言编写求弦截法求方程,虽然写得很简单,但大致思想还是有的哈
  • Python 简单迭代法/Newton迭代法/弦截法 求方程模块导入直接上代码 模块导入 import math 直接上代码 """ 迭代方程为:e^x-x^2+3*x-2=0 构建函数方程 fun = math.exp(x)-x**2+3*x-2 方程导数 fun_dc = math.exp...

    Python 简单迭代法/Newton迭代法/弦截法 求方程的根

    模块导入

    import math
    

    直接上代码

    """
    迭代方程为:e^x-x^2+3*x-2=0
    构建函数方程 fun = math.exp(x)-x**2+3*x-2
    方程导数  fun_dc = math.exp(x)-2*x+3
    迭代初值 x = 0
    """
    import math
    
    """简单迭代法"""
    def easy_iteration(x):
        x_next = (x ** 2 - math.exp(x) + 2) / 3
        while abs(abs(x) - abs(x_next)) > 0.0001:
            x = x_next
            x_next = (x ** 2 - math.exp(x) + 2) / 3
        print(x, x_next)
        print('\n')
    
    
    """Newton迭代法"""
    def Newton_iteration(x):
        fun = math.exp(x) - x ** 2 + 3 * x - 2
        fun_dc = math.exp(x) - 2 * x + 3
        x_next = x - fun / fun_dc
        while abs(abs(x) - abs(x_next)) > 0.0001:
            x = x_next
            fun = math.exp(x) - x ** 2 + 3 * x - 2
            fun_dc = math.exp(x) - 2 * x + 3
            x_next = x - fun / fun_dc
        print(x, x_next)
        print('\n')
    
    
    """弦截法"""
    def string_iteration(x, x0):
        fun = math.exp(x) - x ** 2 + 3 * x - 2
        fun_x0 = math.exp(x0) - x0 ** 2 + 3 * x0 - 2
        x_next = x - fun * (x - x0) / (fun - fun_x0)
        while abs(abs(x) - abs(x_next)) > 0.0001:
            x = x_next
            fun = math.exp(x) - x ** 2 + 3 * x - 2
            x_next = x - fun * (x - x0) / (fun - fun_x0)
        print(x, x_next)
        print('\n')
    
    
    if __name__ == '__main__':
        print('简单迭代法:')
        easy_iteration(x=0)
    
        print('Newton迭代法:')
        Newton_iteration(x=0)
    
        print('弦截法:')
        string_iteration(x=0, x0=0.25)
    
    
    展开全文
  • 分别用逐步搜索法、二分法、比例求法、牛顿法、弦截法求下列方程,并分别画出几种方法所求的收敛速度对比图(即画出相对误差随迭代步数的变化趋势图) f(x)=cos(x)−x f(x)=cos(x)-x f(x)=cos(x)−x f(x...

    本文为《数值计算方法》的作业之一

    之二:【MATLAB】欧拉法、2阶R-K法、4阶R-K法、预测-校正法(M-S法、A-M法)、有限差分法
    解常微分方程

    之三:

    收敛性比较

    分别用逐步搜索法、二分法、比例求根法、牛顿法、弦截法求下列方程的根,并分别画出几种方法所求根的收敛速度对比图(即画出相对误差随迭代步数的变化趋势图)

    • f(x)=cos(x)x f(x)=cos(x)-x

    图1

    • f(x)=x121 f(x)=x^{12}-1

    在这里插入图片描述

    • 代码
    
    clear
    % f(x) = 0 
    f = @(x)cos(x) - x
    x_left = -1;
    x_right = 2;
    stepsMax= 15;
    % 逐步搜索法、二分法、比例求根法、牛顿法、弦截法error
    errors = zeros(stepsMax,5);
    syms x
    df = matlabFunction(diff(f(x)))% 求导
    if(f(x_left) * f(x_right) >= 0)
        disp("f(x_left) * f(x_right) >= 0")
    end
    % 逐步搜索法
    a = x_left;
    b = x_right;
    h = (x_right - x_left)/stepsMax;
    for i = 1:stepsMax
        c = a + h;
        errors(i,1) = f(c);
        if f(c)==0  
            break;
        elseif f(c)*f(b)<0    
            a = c;
        else
            b = c;
        end
    end
    % 二分法
    a = x_left;
    b = x_right;
    for i = 1:stepsMax
        c = (a+b)/2;
        errors(i,2) = f(c);
        if f(c)==0  
            break;
        elseif f(c)*f(b)<0    
            a = c;
        else
            b = c;
        end
    end
    % 比例求根法
    a = x_left;
    b = x_right;
    for i = 1:stepsMax
        c = a - f(a)/(f(a)-f(b))*(a-b);
        errors(i,3) = f(c);
        if f(c)==0  
            break;
        elseif f(c)*f(b)<0    
            a = c;
        else
            b = c;
        end
    end
    % 牛顿法
    c = x_right;
    for i = 1:stepsMax
        c = c - f(c)./df(c);
        errors(i,4) = f(c);
        if f(c)==0  
            break;
        end
    end
    % 弦截法
    c = x_right;
    d = x_left;
    for i = 1:stepsMax
        temp = d;
        d = d - f(d)*(c-d)/(f(c)-f(d));
        c = temp;
        errors(i,5) = f(d);
        if f(c)==0  
            break;
        end
    end
    
    
    figure
    hold on
    errors = abs(errors);
    for i = 1:5
        semilogy(errors(:,i),".-");
    end
    
    
    

    展开全文
  • 弦截法是一个近似的值公式(也就是数学中的极限的问题),不断的套用公式---最后的值无线趋近于解(看成方程的解)。 参考百度百科图: 其中Xi( i = 1,2,3,----)值是无限趋近与函数的解的。 图解很...

    1、 对问题的原理上的理解

    弦截法是一个近似的求值公式(也就是数学中的求极限的问题),不断的套用公式---最后的值无线趋近于解(看成方程的解)。
    参考百度百科图:
    在这里插入图片描述
    其中Xi( i = 1,2,3,----)值是无限趋近与函数的解的。

    图解很容易理解公式就直接记(大佬的推导过程先就不深究):
    参考:

    https://www.jianshu.com/p/00fdad8fa8d7

    在这里插入图片描述

    #include <stdio.h>
    #include <math.h>
    #define DELTA 1E-6
    extern float f(float x);
    extern float axis(float x1, float x2);
    extern float root(float x1, float x2);
    extern  int a, b, c, d;
    void main()
    {
    
        float x1, x2, fx1, fx2, x;
        printf("-----");
        scanf("%d%d%d%d%d", &a, &b, &c, &d);
        do
        {
            printf("]]]]");
            scanf("%f%f", &x1, &x2);
            fx1 = f(x1);
            fx2 = f(x2);
    
        } while (fx1 * fx2 >= 0);
    
        x = root(x1, x2);
        printf("We got a root %8.4f between %f and %f\n", x, x1, x2);
    }
    
    float f(float x)
    {
        float y;
        y = ((a * x + b) * x + c) * x + d;
        return y;
    }
    float axis(float x1, float x2)
    {
        float X;
        X = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
    }//弦截法的公式变形---题目提供公式
    float root(float x1, float x2)
    {
        float x, y, y1;
        y1 = f(x1);
        do
        {
            x = axis(x1, x2);
            y = f(x);
            if (y * y1 > 0)
            {
                y1 = y;
                x1 = x;
            }
            else
            {
                x2 = x;
            }
        } while (fabs(y) > DELTA);
        return x;
    }
    
    
    展开全文
  • 求方程x^3-2x^2+x-2=0在[1,3]之间的。 答案应该是2,但我的运行结果是1.15366e+029 ``` #include <iostream> #include <math.h> using namespace std; float f(float x) { float y; y=x*x*x-2*x*x+x...
  • 弦截法求方程 f(x)=x3-5x2+16x-80=0 的。 1、方法分析 (1) 取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个。如果f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1)、f(x2)异号为止。注意...
  • 弦截法求方程f(x)=x^3-5x^2+16x-80=0的

    千次阅读 2019-11-25 21:52:24
    使用弦截法求方程f(x)=x3-5x2+16x-80=0的。方法如下: (1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1, x2)区间内必有一个。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。...
  • 弦截法求解方程

    千次阅读 2011-09-10 18:34:07
    /* 用弦截法求解方程 算法思想 三元方程的函数增减单调特性 定义X1,X2两个坐标 使得F(X1) 与F(X2) 的值相反 这样X1,X2之间必有一跟 由下面的弦截法公式焦点坐标 当F(X)与F(X1)同符号时,证明F(X)>0则新区间...
  • 参考:https://www.jianshu.com/p/00fdad8fa8d7 需要知道牛顿的近似解的迭代公式
  • #includefloat f(float x) { float y; y=((x-5.0)*x+16.0)*x-80.0; return(y); } float xpoint(float x1,float x2) { 
  • 假定在一次实际的建筑设计中,伟大的设计师经过一波辛苦的操作终于得到一个最终的函数f(x)f(x)f(x),只需要出这个函数f(x)f(x)f(x)的零点,就可以完成整个项目的设计: y=f(x)=x2+lnx,(x>0). y=f\left(x\right)...
  • 弦截法 一元非线性方程求根 C语言实现
  • 非线性方程求根——弦截法

    千次阅读 2018-05-12 20:12:53
    Newton迭代法的改进——弦截法个人学习笔记!一、弦截法原理Newton法要计算函数的导数,当导数不方便计算时,可以利用导数的定义,由相近点处函数值的差来近似,这就得到弦截法公式: 求解时需要给出 x0,x1两个...
  • #include #include double x,x1,x2; double fx(double x) { double c; c=x*x*x-5*x*x+16*x-80; return(c); } double root(double x1,double x2) { do{ double k,b; k=(fx(x1)-fx(x2))/(x1-x2);... b=fx(x1)-k
  • 029 弦截法求根

    千次阅读 2015-02-12 16:52:16
    弦截法求解三元一次方程,思路如下: 1. $第一步,不同的点x_1和x_2, 直到 f(x_1) 和 f(x_2)相异,则 (x_1,x_2)区间内必有一个。$ 2. $第二步,连接x_1和x_2两点,连线在x轴的焦点, 由如下公式可以出$$$ x=\...
  • 1.4方程求根弦截法

    2019-02-19 15:11:00
    目录 目录 前言 (一)弦截法的分析 1.定义 2.条件 3.思想 1.误差 (二)代码实现 1.算法流程图 2.源代码 (三)案例演示 ...
  • 本次实验,熟练的掌握方程求根的最基本、常用的运算方法和理论。主要有二分法、牛顿法、弦截法,并体会它们各自不同的特点及收敛速率。计算方法试验中的第四个方程求根
  • end X=vpa(x,4),%精确到小数点后第三位 N=k 〖运行结果〗 4、分别用单点和双点弦截法求方程 x3 ......实验内容:试分别用二分法、简单迭代法、Newton 迭代法、弦截法(割线法、 双点弦法),求 x5-3x3+x-1= 0 在区间 [-...
  • 链接 牛顿迭代
  • 弦截法求一元三次方程

    千次阅读 2012-07-15 10:09:39
    网上好多人这样写,经过测试,当第二个数大于6时,程序就出错了,我纠结了一下午,原来是float的问题:把float改为double就好了,第二个代码可以解释为什么. #include #include float f(double x) ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

弦截法求方程根