牛顿迭代法-朋友Z与方程

xiaoxiao2021-02-28  146

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?id=1470;

1470: 朋友Z与方程

Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 1131   Solved: 246 [ Submit][ Status][ Web Board]

Description

朋友Z的信中她问了L先生一道题目,可惜L先生太笨,你能帮助他解决吗?

已知等式:6*x^3 + 5*x^2 + 7*x + 9 == Y 给出Y的值请求出x( 0≤x≤10)

Input

输入有多组测试数据,处理到文件结束(测试数据数量<=100000),每组测试数据给出一个浮点数Y(fabs(Y)<10 5 )。

Output

每行输出一个答案。

对于每个测试例如果存在满足条件的x,那么就输出x的值,并精确到小数点后4位,否则输出No solution! 。

Sample Input

100 -10

Sample Output

2.0877 No solution!

HINT

eps<=10-8

思路:牛顿迭代法;

代码:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define eps 0.000001 double f(double x) { return 6*x*x*x+5*x*x+7*x+9; } int main() { double y; while(~scanf("%lf",&y)) { double l=0,r=10; if(f(0)>y+eps||f(10)<y-eps) puts("No solution!"); else { for(int i=0; i<50; i++) { double mid=(l+r)/2; if(f(mid)>y) r=mid; else l=mid; } printf("%.4f\n",l); } } return 0; } 关于牛顿迭代法:

参考:http://www.matongxue.com/madocs/205.html#/madoc;

上面的参考说的很详细;

以下是我根据参考的理解...

给一个函数然后求函数的零点;

在函数上随便选取一个点(xn,f(xn)),则这一点上的切线方程为y=f'(xn) (x-xn) + f(n);那么切线与x轴的交点就是x(n+1)=xn-f(xn)/f'(xn) ;

在根据(xn+1,f(xn+1))这个点找下一个近似根,那么到什么时候为止呢,就是前一个近似根与这个近似根的差接近为0时!

代码可以根据方程具体实现;

本题时给你了确定的y然后求x,可以用二分来求得x;

根据已知得方程可知这个函数时递增得,所以判断无解得条件是:

if(f(0)>y+eps||f(10)<y-eps)

转载请注明原文地址: https://www.6miu.com/read-20776.html

最新回复(0)