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。
输出格式:
一行,三个实根,并精确到小数点后2位。
输入输出样例
1 -5 -4 20
-2.00 2.00 5.00
数据规模太小,可以随便暴力 但为了证明我这几天微积分没白学,用一个高级的方法
首先 f(x)=ax3+bx2+cx+d 求导得到 df/dx=3ax2+2bx+c
求这个导数的零点(就是二次函数求根公式了)得到f(x)的最值点
最值点组成的三个区间一定各有一个f(x)零点,使用牛顿迭代法求得这个零点即可
牛顿迭代法就是不停的用一个点的切线拟合曲线,那个点的导数就是切线斜率 依次类推,可以得到求高次函数零点的一种迭代法:
求n次函数零点,需要极值点来划分区间,也就需要求其导数(n-1次函数)的零点,依次迭代到n=2直接通过公式(当然n=3或4也可以)
最后的复杂度依赖于求零点算法的复杂读
貌似没有人发表过,那么就叫Candy迭代法吧
不过这和三分法求极值相比有优势吗?
//
// main.cpp
// 一元三次方程
//
// Created by Candy on 2016/12/10.
// Copyright © 2016年 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps=1e-;
double a,b,c,d;
inline double f(double x){return ((a*x+b)*x+c)*x+d;}
inline double df(double x){return (*a*x+*b)*x+c;}
double sol(double l,double r){//printf("sol %lf %lf\n",l,r);
int step=;double x=(l+r)/;
while(step--){
x=x-f(x)/df(x);
}
return x;
}
int main(int argc, const char * argv[]) {
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
double p1=(-sqrt(b*b-*a*c)-b)/(*a),
p2=(+sqrt(b*b-*a*c)-b)/(*a);
printf("%.2f %.2f %.2f\n",sol(-,p1),sol(p1,p2),sol(p2,));
return ;
}
NOIP2001 一元三次方程求解[导数+牛顿迭代法]的更多相关文章
- NOIP2001 一元三次方程求解
题一 一元三次方程求解(20分) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范 ...
- [P1034][NOIP2001]一元三次方程求解 (二分)
二分 #include<bits/stdc++.h> using namespace std; double a,b,c,d; double fc(double x) { )+b*pow( ...
- Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
1038 一元三次方程求解 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 有形如:ax3+b ...
- Vijos P1116 一元三次方程求解【多解,暴力,二分】
一元三次方程求解 描述 有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- 洛谷——P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- P1024 一元三次方程求解
P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...
- 洛谷P1024 一元三次方程求解
P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...
- P1024 [NOIP2001 提高组] 一元三次方程求解
题目描述 有形如:a x^3 + b x^2 + c x + d = 0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在 -100至 ...
随机推荐
- [WCF编程]11.错误:错误契约
一.错误传播 服务需要向客户端报告特定错误,当WCF默认的错误屏蔽方法并不包含这一实现.另一个重要的问题与传播到客户端有关,即由于异常是针对特定技术的,因此无法跨越服务边界而被共享.要实现无缝的互操作 ...
- linux下的目录结构和内容
用了这么长时间linux系统,有时候哪个文件应该在哪还是不知道的,所以对于根下的目录结构记下: /bin bin是Binary的缩写.这个目录存放着最经常使用的命令. /boot这里存放的是启动Lin ...
- 第一弹:Java 中创建对象的4种方式
Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...
- 【JAVA并发编程实战】6、中断
所谓的中断操作:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己. 调用一次interrupt中断请求,再次调用就是把中断状态恢复 1.响应中断 处理中断 ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- 高性能 Socket 组件 HP-Socket v3.1.3 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件,提供服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/ ...
- if语句,case语句
1.句式:if...then.判断赋值 例: if RadioButton1.Checked then sex:='男' else if RadioButton2.Checked then sex:= ...
- jQuery siteslider 动画幻灯片
在线实例 效果一 效果二 使用方法 <div class="container demo-1"> <div id="slider ...
- windows下React-native 环境搭建
公司决定试水react-native,mac审批还没下来,没办法,先用windows硬着头皮上吧. 参考文章: React Native 中文网官方文档 史上最全Windows版本搭建安装React ...
- XIB 上的控件不显示怎么办
原文:http://www.cnblogs.com/sandyzhang/p/5660061.html 午休时间遇到有人求助:说是XIB 上内容都有的,但是看不到,demo 运行的话控件都存在的. ...