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

时间:2023-01-07 22:54:44

题目链接: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)<105)。

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)