我如何达到准确的值使用牛顿-拉夫森方法
How do I reach accurate values using Newton-Raphson method?
这里是问题的链接。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) ;
}
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 欧拉项目#8答案是大以获得有效答案
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- 有没有一种方法可以使用预处理器将文本资源拉入原始字符串
- 谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题
- 我如何达到准确的值使用牛顿-拉夫森方法
- 牛顿-拉夫森方法中的迭代计数
- Visual Studio下拉菜单中显示为灰色的类方法