弦截法求一元三次方程的近似解

 1 #include<stdio.h>
 2 #include<math.h>
 3
 4 //计算一元三次方程的根大致分布位置
 5
 6 //计算的方程为 x*x*x-8*x*x+12*x-30=0
 7
 8 //计算函数值
 9 float f(float x)
10 {
11     return ((x-8.0)*x+12.0)*x-30.0;
12 }
13
14 //计算弦与坐标x轴的交点
15
16 float xpoint(float x1,float x2)
17 {
18     return ((x1*f(x2)-x2*f(x1)))/(f(x2)-f(x1));
19 }
20
21 //求解区间内是否有实根
22
23 float root(float x1,float x2)
24 {
25     float x,y,y1;
26     y1=f(x1);
27     do
28     {
29         x=xpoint(x1,x2);
30         y=f(x);
31         if(y*y1 > 0)    //同号
32         {
33             y1=y;
34             x1=x;
35         }
36         else
37         {
38             x2=x;
39         }
40     }while(fabs(y)>=0.0001);
41     return x;
42 }
43
44 int main(void)
45 {
46     float x1=6,x2=8;
47
48     //此处应当加入判断,只有当输入的区间端点使f()的同号的时候才进行进一步计算
49
50     float x;
51
52     x=root(x1,x2);
53
54     printf("root in 6-8 is %5f\n",x);
55     return 0;
56 }

主要就是根的计算的问题,如何判断和重新划分区间是个比较难的地方。

计算交点的公式:

时间: 2024-10-25 14:11:25

弦截法求一元三次方程的近似解的相关文章

用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 ;带注释!

//用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 #include<stdio.h>#include<math.h> float f(float x) //定义子函数f(x) = x^3-5x^2+16x-80,当f(x) →0时,则x即为所求的实数根:  {     float y;     y=((x-5.0)*x+16.0)*x-80.0;     return(y);          //返回f(x)的值  }    float xpoint( float

弦截法求方程根

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 approximat

用弦截法求解方程的根

//弦截法求解方程的根 //要求:输入左右两个端点x值 //结果:在一定精度范围内求解出方程的根 //难点:1)推导出x处的横坐标的求解公式 2)迭代掉原来的左端点或者右端点 #include "pch.h" #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x); double xpoint(double x1,

传递矩阵法求简支梁固有频率的近似解 --matlab程序

%传递矩阵法求简支梁固有频率的近似解 clc clear syms p q Sp = sym('[1 0 0 0;0 1 0 0;0 0 1 0;x 0 0 1]'); %点传递矩阵 Sf = sym('[1 1 1/2 1/6;0 1 1 1/2;0 0 1 1;0 0 0 1]'); %场传递矩阵 n = input('输入划分单元数:'); S = ((Sf*Sp)^(n-1))*Sf; %两端支座之间的传递矩阵 %求固有频率 xs = solve(S(1,2)*S(3,4)-S(1,4)

二分法求一元三次方程的一个实数根

一元一次方程的一般形式是$ax+b=0$,很容易解得$x=-\frac{b}{a}$.对于一元二次方程,也有一个简单的求根公式可以解出方程的根.但是一元三次方程的求根公式较为复杂,需分情况,编写程序的复杂度比前两个要大得多. 你可能已经听说过二分查找法,在已排序的数组中查找某一个数的时间复杂度从$O(n)$降到了$O(lg n)$.类似地,我们可以用二分法来求解一个一元三次方程的实数根. 以下是非递归版本的实现.calc函数用于计算方程取某个$x$值时方程左端的值.因为这个函数只是返回一个计算表

(三) 弦截法(试位法)求根

1 # -*- coding: utf-8 -*- 2 #coding=utf-8 3 import numpy as np 4 from sympy import * 5 import math 6 import matplotlib.pyplot as plt 7 8 plt.close() 9 fig = plt.figure() 10 #网格可见 11 plt.grid(True) 12 plt.axis([0, 2, -10, 50]) 13 #开启交互 14 plt.ion() 15

一元三次方程求解(数学、二分)

https://www.luogu.com.cn/problem/P1024 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求三个实根. Input 四个实数:a,b,c,d Output 由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位 Sample Input 1 -5 -4

NOIP2001 一元三次方程求解[导数+牛顿迭代法]

题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根. 输入输出格式 输入格式: 一行,4个实数A,B,C,D. 输

[NOIP2001] 提高组 洛谷P1024 一元三次方程求解

题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根. 输入输出格式 输入格式: 一行,4个实数A,B,C,D. 输