给定精度e求(1+x)^α的近似值和迭代次数

给定精度e,求(1+x)^α,|x|<1的近似值和迭代次数

 

【问题描述】

给定一个精度e,用下列Taylor公式计算(1+x)a,|x|<1的近似值。

(1+x)a=1+ax+a(a-1)x2/2!+...+[a(a-1)...(a-n+1)]xn/n!+..., |x|<1

其中|x|<1,e为实数,a为实数。编写程序根据用户输入的x(|x|<1)、a和e的值,利用上述Taylor展开式计算(1+x)a的近似值,要求前后两次迭代之差的绝对值小于e,给出相应的最小迭代次数n和最后一次计算的(1+x)a的值。
【输入形式】

从控制台输入小数x(|x|<1且x不等于0)、实数a和实数e(0<e<|x|),两数中间用空格分隔。

【输出形式】

控制台输出公式结果:输出迭代次数n和最后一次计算的(1+x)a的值(以一个空格分隔,并且输出(1+x)a时要求小数点后保留8位有效数字)。

【样例输入1】


0.63628 0.5 0.00000001


【样例输出1】


28 1.27917161


【样例输入2】


0.47683 -0.5 0.00000001


【样例输出2】


23 0.82287667


【样例说明】

输入x为0.63628,a为0.5,e为0.00000001(小数点后8位),当n为28时,根据Taylor展开式求得(1+x)a近似值为1.279171611(小数点后9位),n为29时,根据Taylor展开式求得(1+x)a近似值为1.279171605(小数点后9位),两结果之差绝对值约为0.000000006(小数点后9位),小于要求的精度,所以最小迭代次数为28,最后一次计算的(1+x)a的值为1.27917161(小数点后保留8位有效数字);同样,输入x为0.47683,a为-0.5,e为0.00000001(小数点后8位),当n为23时,根据Taylor展开式求得(1+x)a近似值为0.822876669(小数点后9位),n为24时,根据Taylor展开式求得(1+x)a近似值为0.822876664(小数点后9位),两结果之差绝对值约为0.000000005(小数点后9位),小于要求的精度,所以最小迭代次数为23,最后一次计算的(1+x)a的值为0.82287667(小数点后保留8位有效数字)

注意:为保证数据的准确性和一致性,请使用double数据类型保存计算结果。


更详细的说明请移步与 https://blog.csdn.net/qq_41682681/article/details/80739087


下面附上我的代码

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    double x,a,e,oval,nval,total=1;
    cin >> x >> a >> e;
    nval = oval = a * x ;
    total += nval;
    int i;
    for(i = 3; i != 0 ; i++)
    {
        a -= 1;
        nval = oval * a * x / (i-1);
        if(fabs(nval) < e )
        {
            break;
        }
        total += nval;
        oval = nval;
    }
    cout << i-1 << " " << fixed << setprecision(8) << total;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41682681/article/details/80813738