---
title: 牛顿迭代法
date: 2021-10-15 19:20:43
tags: 算法
牛顿迭代算法
牛顿迭代算法
百度百科上讲述的比较清楚,这里大致介绍一下。
背景:多数方程不存在求根公式,因此求精确根比较复杂,甚至不可解,从而寻找方程的近似解就显得很重要。方法是使用*f(x)*的泰勒级数的前面几项来寻找方程f(x)的根。
牛顿迭代公式
Markdown中Latex数学公式基本语法;设r是f(x)=0的根,选取x0作为r的初始近似值,过点\((x0,f(x0))\)做曲线y=f(x)的切线:L:y=f(x0)+f’(x0)(x-x0)则L与x轴的交点的横坐标\(x_1=x_0-\frac{f(x0)} {f’(x0)}\) 称x1为r的一次近似值。过点\((x1,f(x1))\)做曲线\(y=f(x)\)的切线x2=x1-\(\frac{f(x1)}{f’(x1)}\);由上式可以迭代求算推导出公式为:\(x_(n+1)=x_n-\frac{f(x_n)}{f’(x_n)}\)根据以上公式便可以编程计算。
例题:P138第十四题
//牛顿迭代法
#include<stdio.h>
#include<math.h>
int main()
{
float f1, x=1.5, f2,x1;
int m = 0;
//f1 = 2 * x * x * x - 4 * x * x + 3 * x - 6;//原函数
//f2 = 5 * x * x - 8 * x + 3;//原函数一阶导数
for (int i = 0;i < 30;i++)
{
f1 = 2 * x * x * x - 4 * x * x + 3 * x - 6;//原函数
f2 = 6* x * x - 8 * x + 3;//原函数一阶导数
x1 = x - (f1 / f2);
if (fabs(x - x1) < 1e-5)
break;
m++;
x = x1;
}
printf("%.2f\n",x);
printf("%d\n",m);
}
至于具体函数需要具体配置,这里算是是实现了牛顿插值公式的思想。