我如何达到准确的值使用牛顿-拉夫森方法

How do I reach accurate values using Newton-Raphson method?

本文关键字:-拉 方法 何达      更新时间:2023-10-16

这里是问题的链接。http://www.spoj.com/problems/TRIGALGE/

这个问题很简单,我们只需要解给定的方程。我决定尝试使用牛顿-拉夫森方法(https://en.wikipedia.org/wiki/Newton%27s_method)。

这是一个链接到我的代码,我已经提交,但得到了一个错误的答案->http://ideone.com/dYev3P

我无法理解精确性背后的逻辑。对于

a=1 b=1 c=20
x should be , x=19.441787

但是我得到

x=19.441786

我打印了整个系列100次迭代,但我没有得到确切的值。请告诉我正确的方法以及如何在处理浮点整数时获得正确的精度

牛顿-拉夫森的基本思想是逐次逼近。在一定范围内,您希望每个近似都比前一个更好(尽管无论如何都不能完全保证)。

就您的代码而言,您使用的是float s,它仅适用于大约7位有效数字的精度。这让你的17.44179是你应该真正希望的最好的(事实上,在四舍五入到7位数之后,这正是你得到的)。

如果你真的需要8位的精度,你应该使用double而不是float作为你的数据类型。这并不能改变你处理连续近似值的事实,但它确实意味着你可以期望大约15位的精度,而不是只有7位。

我可能还应该注意到,计算机浮点数通常都是近似值。使用正确的库,您可以接近数百甚至数万亿个数字,但是当您处理浮点数时,您通常不应该期望某个特定的答案是正确的,而其他答案是错误的,即使它们几乎等于"正确"的答案。相反,你应该期待一些小的变化作为一个规则("小"是一个相对的术语)。,可接受误差是相对于所涉及的数字的大小。

除了Jerry的答案外,不要忘记在每个1.0相乘后删除.f,以便将它们视为浮点数。这个方法和把你所有的浮点数都改成double绝对可以达到这个效果。

如果您只是将float更改为double,则在迭代7之后确实已经获得19.441786710

#include <cmath>
#include <iostream>    
void solve(int a,int b,int c){
    double x = 0.2 ;
    for(int i=0;i<15;i++){
        x = x*1.0 - ( ( (a*x*1.0 + ( b*sin(x)*1.0 ) )*1.0 - c*1.0  )/
           (a*1.0  + b*(cos(x))*1.0 ) ) ;
        std::cout << i << " " << x-19.441787 << std::endl;
    }
}
int main(){
    solve(1,1,20) ;
}