【计算方法】牛顿-拉弗森法(非线性方程的求解)
牛顿法
设函数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-100的平方根python_使用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)...
牛顿法(Newton's method)又称为牛顿-拉弗森法(Newton-Raphson method),是一种近似求解实数方程式的方法.(注:Joseph Raphson在1690年出版的< ...
- 牛顿拉夫森法 matlab,【原创】牛顿-拉夫森迭代求非线性方程组
function [xf,fval,iter]=newtmullt(e,x0,es,maxit,varargin) % written by tubehu % www.MATLABsk ...
- 【Math ML】Newton-Raphson.python 牛顿拉夫森方法
牛顿·拉弗森方法 牛顿·拉弗森方法 牛顿·拉弗森方法原理与举例 python 手写牛顿拉弗森 python 调用牛顿拉弗森函数一步求解 牛顿·拉弗森方法 牛顿拉弗森方法 用于求解近似方程式的根,f(0 ...
- 数值分析之牛顿拉夫森迭代(牛顿法)
@数值分析之非线性方程求解 文章目录 一.牛顿拉夫森迭代 1.1 牛顿拉夫森法 1.1.1 牛顿-拉夫森定理: 1.1.2 matlab版算法: 二.题目及实现代码 2.1 题目 2.2 输入输出格式 ...
- 牛顿—拉夫森迭代、加速牛顿—拉夫森迭代和哈利法改进牛顿——拉夫森迭代
目录 一.牛顿-拉夫森迭代 1.1牛顿-拉夫森定理 1.2牛顿-拉夫森迭代的matlab实现 1.3牛顿-拉夫森迭代的python实现 二.加速-牛顿拉夫森迭代 2.1牛顿-拉夫森迭代的加速收敛 2. ...
- 牛顿-拉夫逊法 原理讲解以及python算例实现
文章目录 一.基本原理 二.原理深入讲解 1 .切线是曲线的线性逼近 2. 牛顿-拉夫逊法 3 .牛顿-拉夫逊法是否总是收敛(总是可以求得足够近似的根)? 三.pythons实例 总结 一.基本原理 ...
- C++newton raphson method牛顿拉夫森法的实现算法(附完整源码)
C++newton raphson method牛顿拉夫森法的实现算法 C++newton raphson method牛顿拉夫森法的实现算法完整源码(定义,实现,main函数测试) C++newto ...
- 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 ...
- MIT公开课: Python 笔记6 二分法,牛顿-拉夫森方法,列表
Lecture5: Bisection methods , Newton/Raphson, introduction to lists二分法,牛顿,拉复生方法,列表 Bisection methods ...
最新文章
- Linux串口原理与编程
- 微信分享JSSDK-invalid signature签名错误的解决方案
- 基于HTML5实现3D热图Heatmap应用
- 使用 wxImage 为 OpenGL 加载纹理
- git生成SSH-Key
- SAP Spartacus B2B功能,只渲染BodyContent position里的UI
- Exp4 恶意代码分析 20164302 王一帆
- 软件推荐:微软桌面助手软件上手体验
- 图像识别:利用KNN实现手写数字识别(mnist数据集)
- pytorch VGG
- 一键搞定JavaEE应用, JRE + Tomcat + Mysql - JaveEE绿色运行环境JTM0.9版,将web变得像桌面应用一样简单.
- python爬取统计局数据_利用Python抓取行政区划码的方法
- CodeForces 760B	Frodo and pillows
- thinkpad x250装黑苹果教程_Thinpad T系列安装MAC OS 黑苹果教程
- 软件项目规模度量与实际应用
- 2014-2015 少年辛苦终身事,莫向光阴惰寸功
- 大学生申请软著的好处
- win7手动恢复注册表
- 安全事件日志中的事件编号与描述
- v-if 和 v-show的区别是什么? 什么时候使用v-if更好? 什么时候用v-show更好?