我正在使用一个简单的程序,使用Newton-Raphson的方法计算任何给定函数的根。在这个程序中,我必须打印找到的根和迭代次数。程序本身很好,我可以找到任何给定函数的根,但我不能正确计算迭代次数。它总是超过5。迭代次数或比它少1。这是C ++中的代码:
(function() {
'use strict';
Polymer({
is: 'content-el',
_len: function(first, last) {
return first.length + last.length;
}
});
})();
我很确定错误出现在这段代码中:
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
double f(float x)
{
double function1;
function1 = exp(x)- 4*pow(x,2); // given function
return function1;
}
double derivative(float x)
{
double derivative1;
derivative1 = exp(x) - 8*x; // derivative of given function
return derivative1;
}
void newtonMethod(double x0, double error, int N)
{
double xNext, xPrevious, root;
int k;
xPrevious = x0;
for(int i = 0; i < N || f(xNext) > error; i++)
{
xNext = xPrevious - (f(xPrevious)/derivative(xPrevious)); // calculates the next value of x
xPrevious = xNext;
root = xNext;
k = i;
}
cout << endl;
cout << "Iterations made: " << k << endl;
cout << endl;
cout << endl;
cout << endl;
cout << "Root is: " << root << endl;
}
int main()
{
double x0, error;
int N; // max. number of iterations you can do
cout << "Enter x0: ";
cin >> x0;
cout << "Enter the error: ";
cin >> error;
cout << "Enter the max. number of iterations: ";
cin >> N;
newtonMethod(x0, error, N);
}
如果我运行此程序并将N = 100,它会显示正确的根,但它会打印“Iterations made = 99”,但这是错误的。如何打印正确的迭代次数?例如,对于上面程序中的函数(e ^ x - 4x²),如果我输入x0 = 0.5且error = 0.0001,它应该在第四次迭代中停止。如何解决?
答案 0 :(得分:1)
回答你的问题,这就是为什么以下代码不起作用的原因:
;i < N || f(xNext) > error;
这只是因为在for循环条件下,它是一个继续条件,它被评估,而不是停止条件。
在上面的代码中,您告诉编译器的是:继续循环,只要i < N
为真或f(xNext) > error
为真。因此,当您输入x0 = 0.5
,error = 0.0001
和N = 100
时,循环的作用是它不会停止,直到两个条件都为假,即当我达到 N 和f(x)中的容差小于错误。
现在,解决方案只是将||
运算符交换为&&
运算符。像这样:
i < N && f(xNext) > error;
但是,您的xNext
未初始化。由于您的xNext
和xPrevious
在每个循环结束时相同,我只需添加xPrevious
。另外,正如@Rathat写的那样,用f(x)来评估你的公差应该取其绝对值,所以:
i < N && abs(f(xPrevious)) > error;
最后,自从k + 1
开始以来,您应该将迭代次数输出为i = 0
。
这可以解决您的问题。
答案 1 :(得分:0)
感谢所有答案。除了@yuxiangDev解释得很好的for
条件背后的逻辑之外,我发现了什么是错的。尽管@RatHat代码完全正确,但错误发生在我正在使用的math.h
库中。我试过<cmath>
并且效果非常好!洛尔。