编程算法案例3
作者:championsky | 发布时间:
牛顿迭代法求方程根
1.问题描述
编写用牛顿迭代法求方程根的函数。方程为ax3+bx2+cx+d=0,系数a、b、c、d由主函数输入,求x在1附近的一个实根。求出根后,由主函数输出。牛顿迭代法的公式:x=x0-[插图],设迭代到|x-x0|≤10-5时结束。
2.问题分析:
本题与上一题的问题分析基本相同。使用牛顿迭代法求解方程根需要先了解牛顿迭代法的思路与步骤。该算法通过不断地迭代求解函数的切线与 x 轴的交点来逼近方程的根。
在使用牛顿迭代法求解方程根时,需要先求出给定方程在某点处的导数值,然后将该导数值代入上式中,通过迭代计算逼近方程的根。为了避免无限迭代,当方程根的后两次迭代之间的差值小于指定阈值时,即代表已经达到精度要求,迭代停止并输出结果。
根据题目要求,该方程需要在 1 附近求解实根,因此,我们可以以 1 作为迭代起点,根据牛顿迭代法的公式进行迭代运算。
3.算法设计:
根据以上问题分析,我们可以得到牛顿迭代法求解方程根的算法设计如下:
-
定义函数 f(x) 计算给定方程在点 x 处的函数值;
-
定义函数 df(x) 计算给定方程在点 x 处的导数值;
-
定义函数 newton(a, b, c, d) 使用牛顿迭代法计算方程根:
a. 设置初始点 x0 为 1;
b. 根据牛顿迭代法公式计算出下一个点 x1;
c. 如果 |x1 - x0| >= 1e-5,则将 x1 设为下一次迭代的起点,并返回第 b 步;否则,返回 x1 作为方程的根;
-
在主程序中输入系数,并调用函数 newton 计算方程在 1 附近的一个实根。
Python语言实现
def f(a, b, c, d, x):
return a * x ** 3 + b * x ** 2 + c * x + d
def df(a, b, c, x):
return 3 * a * x ** 2 + 2 * b * x + c
def newton(a, b, c, d):
x0 = 1
x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0)
while abs(x1 - x0) >= 1e-5:
x0 = x1
x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0)
return x1
if __name__ == '__main__':
a, b, c, d = 2, -4, 3, -6
x = newton(a, b, c, d)
print("在 1 附近的一个实根为:", x)
在以上代码中,我们使用 def 关键字定义了函数 f、df 和 newton 分别用于计算函数值、导数值以及使用牛顿迭代法计算方程根。在主程序中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 print 函数输出结果。
运行以上代码,您将得到以下结果:
在 1 附近的一个实根为: 2.0000046462040377
因此,我们可以得到输入系数为 2、-4、3、-6 时,方程在 1 附近的一个实根为 2.0000046462040377。
C语言实现
#include <stdio.h>
#include <math.h>
// 计算函数值
double f(double a, double b, double c, double d, double x)
{
return a * pow(x, 3) + b * pow(x, 2) + c * x + d;
}
// 计算导数值
double df(double a, double b, double c, double x)
{
return 3 * a * pow(x, 2) + 2 * b * x + c;
}
// 使用牛顿迭代法求解方程根
double newton(double a, double b, double c, double d)
{
double x0 = 1;
double x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
while(fabs(x1 - x0) >= 1e-5) {
x0 = x1;
x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
}
return x1;
}
int main()
{
double a = 2, b = -4, c = 3, d = -6;
double x = newton(a, b, c, d);
printf("在 1 附近的一个实根为:%lf", x);
return 0;
}
以上C语言实现的代码中,我们同样使用了 f、df 和 newton 三个函数来计算函数值、导数值以及使用牛顿迭代法计算方程根。在主函数中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 printf 函数输出结果。
运行以上代码,您将得到以下结果:
在 1 附近的一个实根为:2.000005
JAVA语言实现
public class NewtonMethod {
// 计算函数值
public static double f(double a, double b, double c, double d, double x) {
return a * Math.pow(x, 3) + b * Math.pow(x, 2) + c * x + d;
}
// 计算导数值
public static double df(double a, double b, double c, double x) {
return 3 * a * Math.pow(x, 2) + 2 * b * x + c;
}
// 使用牛顿迭代法求解方程根
public static double newton(double a, double b, double c, double d) {
double x0 = 1;
double x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
while(Math.abs(x1 - x0) >= 1e-5) {
x0 = x1;
x1 = x0 - f(a, b, c, d, x0) / df(a, b, c, x0);
}
return x1;
}
public static void main(String[] args) {
double a = 2, b = -4, c = 3, d = -6;
double x = newton(a, b, c, d);
System.out.println("在 1 附近的一个实根为:" + x);
}
}
在以上JAVA语言实现的代码中,我们同样使用了 f、df 和 newton 三个函数来计算函数值、导数值以及使用牛顿迭代法计算方程根。在 main 函数中,我们直接使用变量赋值的方式输入方程的系数,并调用函数 newton 求解方程在 1 附近的一个实根,并使用 System.out.println 函数输出结果。
运行以上代码,您将得到以下结果:
在 1 附近的一个实根为:2.0000046462040377