繁体   English   中英

Java程序为函数e ^ x给出了错误的泰勒级数术语

[英]Java program gives incorrect Taylor series term for function e^x

//java program that asks the user  to input a number that e^x=1+x+x^2/2! +x^3/3!... e is a mathematical constant equal to 2.718...

import java.util.Scanner;
public class taylor_2 {
  public static void main(String args[]) {
    Scanner input=new Scanner(System.in);
    double x; //input for x
    double factorial=1; //initializes factorial
    int counter=1; //initializes counter
    double result=1; //initializes result

    System.out.println("Enter non negative number"); //asks user to enter x
    x=input.nextInt();

 //output in while loop will continue to be generated if user doesn't entered a negative number

    while(x<1){
      System.out.println("I said entered a positive number");
      x=input.nextInt();
    }
    while(x>counter){
      factorial=factorial*counter;//factorial formula
      result=result+(Math.pow(x,counter))/factorial; //equation for e^x=1+x+x^2/2! +x^3/3!
      counter++;
    }
    System.out.println("Taylor series is " +result);//output for taylor equation e^x
  }
}

这是我的代码的输出:

输入非负数

2

泰勒级数是4.0

当我输入2时,由于e = 2.718 ...和e ^ 2 = 7.3890560983,它应该已经输出7.3890560983而不是4.0。 我究竟做错了什么?

问题在于泰勒级数与e ^ x的函数不同。 它将返回一个与函数e ^ x接近的函数。

为了更好地理解它,建议您查看下一个链接的第二张图片:

https://zh.wikipedia.org/wiki/泰勒系列

您可以在上一张图片中看到,随着n变大,该函数变得越来越精确。

您的代码的问题是x值是n值,这不是真的。

x:必须是您现在想要的值e ^ x。

n:是您的方程式的精确度。 越大意味着越准确。

因此,您必须使用while(n>counter)更改while(x>counter) ,其中n可以是具有用户所选精度的变量,也可以是具有所选精度的常数。

我认为,直到x=100n=150应该可以工作。

希望对您有所帮助! :)

这里似乎有一个答案:即使算法与您的算法略有不同,EX还是泰勒系列的C ++。 这是它的Java版本:

public class TaylorSeries {
public static void main(String args[]) {
    Scanner input = new Scanner(System.in);

    System.out.println("Enter x:");
    double x = input.nextDouble();

    double result = calcExp(x);
    System.out.println("calcExp(x) = " + result);
    System.out.println("       e^x = " + Math.pow(Math.E, x));
}

static double calcExp(double x) {
    double eps = 0.0000000000000000001;
    double elem = 1.0;
    double sum = 0.0;
    boolean negative = false;
    int i = 1;
    sum = 0.0;

    if (x < 0) {
        negative = true;
        x = -x;
    }

    do {
        sum += elem;
        elem *= x / i;
        i++;
        if (sum > Double.MAX_VALUE) {
            System.out.println("Too Large");
            break;
        }
    }
    while (elem >= eps);

    return negative ? 1.0 / sum : sum;
}
}

输出:

Enter x:
2
calcExp(x) = 7.389056098930649
       e^x = 7.3890560989306495

所有功劳都应归于此处: EXP到Taylor系列 我只将C ++代码转换为Java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM