牛顿法

设函数y=f(x)同x轴相较于点(p,0),我们假设初始值p0在p附近,过函数曲线上点(p0,f(p0))的切线与x轴交线为p1
如图上这样反复迭代,不断逼近p点,这里同样可以用斜率的公式去推导p1和p0的关系式:

经过证明,该玩意可以推广至pk项和pk-1项,且是收敛的。同时公式的推导也可以采用泰勒展开式去推导。

需要注意
除零错误,可以看到导数项是作为分母,不能为零的。

割线法

由于该方法是需要求导数项的,为了避免导数的计算,我们可以做进一步的优化,

然后我们依然通过斜率的方式来推导公式

终止迭代条件

前后两次p的绝对误差、相对误差以及求出来的f§函数值精度
同时注意,在C/C++中,若要使用库定义的数学常量,须在文件头加上这一句

#define _USE_MATH_DEFINES

例题

【问题描述】在考虑空气阻力情况下,求解投射体撞击地面时经过的时间和水平飞行行程,其中:y=f(t)=9600*(1-e**(-t/15.0)) - 480t;x=r(t)=2400(1-e**(-t/15.0))。
【输入形式】在屏幕上输入3个数,分别表示起始值、前后两次迭代的差的绝对值精度和f(t)函数值的精度。各数间都以一个空格分隔。
【输出形式】第一行输出投射体撞击地面时经过的时间,第二行输出水平飞行行程,精确到小数点后3位。
【样例1输入】
8 1 1
【样例1输出】
9.090
1090.692
【样例1说明】输入:起始值为8、前后两次迭代的差的绝对值精度为10**(-1)和f(t)函数值的精度为10**(-1)。输出:第一行输出投射体撞击地面时经过的时间为9.090秒,第二行输出水平飞行行程为1090.692ft。
【评分标准】根据输入得到的输出准确

AC代码:

/** @Author: csc* @Date: 2021-03-19 18:35:13* @LastEditTime: 2021-03-19 19:18:57* @LastEditors: Please set LastEditors* @Description: In User Settings Edit* @FilePath: \code_formal\course\cal\niudun.cpp*/#define _USE_MATH_DEFINES
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <string.h>
#include <string>
#include <numeric>
#include <cmath>
#include <map>
#include <vector>
#include <cstdio>
#include <cmath>
#define pr printf
#define sc scanf
#define sf(n) scanf("%d", &n)
#define sff(n1, n2) scanf("%d %d", &n1, &n2)
#define sfff(n1, n2, n3) scanf("%d %d %d", &n1, &n2, &n3)
#define sl(n) scanf("%lld", &n)
#define sll(n1, n2) scanf("%lld %lld", &n1, &n2)
#define slll(n1, n2, n3) scanf("%lld %lld %lld", &n1, &n2, &n3)
#define for0(i, n) for (i = 0; i < n; i++)
#define for1n(i, n) for (i = 1; i <= n; i++)
#define foran(i, a, n) for (i = a; i <= n; i++)
#define forna(i, a, n) for (i = n; i >= a; i--)
#define pb push_back
#define fi first
#define se second
#define int long long
#define mem(ara, n) memset(ara, n, sizeof(ara))
#define memb(ara) memset(ara, false, sizeof(ara))
#define all(x) (x).begin(), (x).end()
#define sq(x) ((x) * (x))
#define sz(x) x.size()
const int N = 2e5 + 100;
const int mod = 998244353;
namespace fastIO
{inline void input(int &res){char c = getchar();res = 0;int f = 1;while (!isdigit(c)){f ^= c == '-';c = getchar();}while (isdigit(c)){res = (res << 3) + (res << 1) + (c ^ 48);c = getchar();}res = f ? res : -res;}inline int qpow(int a, int b){int ans = 1, base = a;while (b){if (b & 1)ans = (ans * base % mod + mod) % mod;base = (base * base % mod + mod) % mod;b >>= 1;}return ans;}
} // namespace fastIO
using namespace fastIO;using namespace std;double newton(double p, double del, double eps)
{auto f = [&](double t) -> double {return 9600 * (1 - pow(M_E, -t / 15.0)) - 480 * t;};auto f1 = [&](double t) -> double {return 640 * pow(M_E, -t / 15.0) - 480;};double p1 = p - f(p) / f1(p);double cha = abs(p1 - p);double re = 2 * cha / (abs(p1) + del);p = p1;double y = f(p);if (cha < del || re < del || abs(y) < eps)return p;elsereturn newton(p, del, eps);
}signed main()
{int _ = 1;//sf(_);while (_--){auto x = [&](double t) -> double {return 2400 * (1 - pow(M_E, -t / 15.0));};double p, d1, d2;cin >> p >> d1 >> d2;double delta = pow(0.1, d1), epsilon = pow(0.1, d2);p = newton(p, delta, epsilon);cout << fixed << setprecision(3) << p << endl;cout << fixed << setprecision(3) << x(p) << endl;}return 0;
}

【计算方法】牛顿-拉弗森法(非线性方程的求解)相关推荐

  1. 牛顿法求解1-100的平方根python_使用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)...

    牛顿法(Newton's method)又称为牛顿-拉弗森法(Newton-Raphson method),是一种近似求解实数方程式的方法.(注:Joseph Raphson在1690年出版的< ...

  2. 牛顿拉夫森法 matlab,【原创】牛顿-拉夫森迭代求非线性方程组

    function [xf,fval,iter]=newtmullt(e,x0,es,maxit,varargin) %     written by tubehu %     www.MATLABsk ...

  3. 【Math ML】Newton-Raphson.python 牛顿拉夫森方法

    牛顿·拉弗森方法 牛顿·拉弗森方法 牛顿·拉弗森方法原理与举例 python 手写牛顿拉弗森 python 调用牛顿拉弗森函数一步求解 牛顿·拉弗森方法 牛顿拉弗森方法 用于求解近似方程式的根,f(0 ...

  4. 数值分析之牛顿拉夫森迭代(牛顿法)

    @数值分析之非线性方程求解 文章目录 一.牛顿拉夫森迭代 1.1 牛顿拉夫森法 1.1.1 牛顿-拉夫森定理: 1.1.2 matlab版算法: 二.题目及实现代码 2.1 题目 2.2 输入输出格式 ...

  5. 牛顿—拉夫森迭代、加速牛顿—拉夫森迭代和哈利法改进牛顿——拉夫森迭代

    目录 一.牛顿-拉夫森迭代 1.1牛顿-拉夫森定理 1.2牛顿-拉夫森迭代的matlab实现 1.3牛顿-拉夫森迭代的python实现 二.加速-牛顿拉夫森迭代 2.1牛顿-拉夫森迭代的加速收敛 2. ...

  6. 牛顿-拉夫逊法 原理讲解以及python算例实现

    文章目录 一.基本原理 二.原理深入讲解 1 .切线是曲线的线性逼近 2. 牛顿-拉夫逊法 3 .牛顿-拉夫逊法是否总是收敛(总是可以求得足够近似的根)? 三.pythons实例 总结 一.基本原理 ...

  7. C++newton raphson method牛顿拉夫森法的实现算法(附完整源码)

    C++newton raphson method牛顿拉夫森法的实现算法 C++newton raphson method牛顿拉夫森法的实现算法完整源码(定义,实现,main函数测试) C++newto ...

  8. R语言 牛顿-拉夫森迭代法求方程组

    牛顿-拉夫森迭代法: xk+1=xk−[f′(x)]−1f(x)x_{k+1}=x_{k}-{[f'(x)]^{-1}}f(x)xk+1​=xk​−[f′(x)]−1f(x) 其中,f′(x)f'(x ...

  9. MIT公开课: Python 笔记6 二分法,牛顿-拉夫森方法,列表

    Lecture5: Bisection methods , Newton/Raphson, introduction to lists二分法,牛顿,拉复生方法,列表 Bisection methods ...

最新文章

  1. Linux串口原理与编程
  2. 微信分享JSSDK-invalid signature签名错误的解决方案
  3. 基于HTML5实现3D热图Heatmap应用
  4. 使用 wxImage 为 OpenGL 加载纹理
  5. git生成SSH-Key
  6. SAP Spartacus B2B功能,只渲染BodyContent position里的UI
  7. Exp4 恶意代码分析 20164302 王一帆
  8. 软件推荐:微软桌面助手软件上手体验
  9. 图像识别:利用KNN实现手写数字识别(mnist数据集)
  10. pytorch VGG
  11. 一键搞定JavaEE应用, JRE + Tomcat + Mysql - JaveEE绿色运行环境JTM0.9版,将web变得像桌面应用一样简单.
  12. python爬取统计局数据_利用Python抓取行政区划码的方法
  13. CodeForces 760B Frodo and pillows
  14. thinkpad x250装黑苹果教程_Thinpad T系列安装MAC OS 黑苹果教程
  15. 软件项目规模度量与实际应用
  16. 2014-2015 少年辛苦终身事,莫向光阴惰寸功
  17. 大学生申请软著的好处
  18. win7手动恢复注册表
  19. 安全事件日志中的事件编号与描述
  20. v-if 和 v-show的区别是什么? 什么时候使用v-if更好? 什么时候用v-show更好?

热门文章

  1. 精美苹果cms影视双端同步APIcloud混合原生APP源码
  2. Qt操作至少需要一个处于启用状态的有效资料档案库
  3. 35 | 别再说不能使用Join了(这次是优化Join查询-下篇)
  4. SQL 1040 - Too many connections
  5. LoRa与NB的区别
  6. js获取今天是今年的第几周
  7. 压缩感知入门②信号的稀疏表示和约束等距性
  8. 类似Windows自带的画图软件mspaint的应用程序Draw
  9. 青橙CEO蔡晓农:给大众高性价比智能机
  10. Spring依赖注入的接口为null