如何表示数学系列

时间:2012-01-10 22:00:56

标签: java

我想构建一个函数,其中一个参数是系列{x[i], i = 0, 1, ..., inf}

例如:x_m = 1/(1+x_(m-1)), m=1,2....inf

对于这个系列,我想检查每个x [i],如果它满足我将定义的某些条件(我不知道它将满足哪个n)。

例如:

如果x_0 < 5,那么我将返回x_0的值。

如果没有 - 我会检查x_1。如果x_1<5,我将返回x_1的值。

依旧......

注意:x_1需要知道x_0的计算值。

有一种简单的方法可以在Java中重新演绎这个系列吗?

3 个答案:

答案 0 :(得分:2)

这只是部分答案:

作为一名数学家,我想说你可能想为系列定义一个界面, 方法double getElement(int m)可能还有更多。 然后,您可能希望根据系列具有不同的实现类。 您可能有FormulaSeriesRecursiveSeries,其中系列由一些递归公式给出(如您的示例所示)。 此类可能在内部存储中间值,以供进一步使用(memoization)。

根据您的目标,您可以实施部分系列, 你只有有限数量的已知值,然后可以存储在列表或数组中。

如果我们关注RecursiveSeries,如果公式很难计算,您可能希望将计算值内部存储在静态Map中,并且您将需要多次元素。这不应该太难以理解。

答案 1 :(得分:2)

以下是您可能代表您尝试做的事情的方式。然而,我提供的和函数肯定不会。

首先,你的序列是一个重复,并在这里递归实现。你会想要记住它。我建议在SeriesUtil中添加一些内容。

更重要的是,你显然无法将$ \ infinity $作为上限。你肯定知道,这是一个非常重要的问题。也就是说,您可以拥有各种实现Series的抽象类,例如GeometricSeries,它们具有已知的解决方案,并在给定系列类型的情况下使用适当的策略。

interface Series {
   double x(int m);
}

class ExampleSeries implements Series {
    public double x(int m) {
        if (m == 0) {
            return 0;
        }

        return 1 / (1 + x(m - 1));
    }
}

class SeriesUtil {
    public static double sum(Series series, int lowerBound, int upperBound) {
        int sum = 0;
        for (int i = lowerBound; i <= upperBound) {
            sum += x(i);
        }

        return sum;
    }
}

答案 2 :(得分:0)

显然,Ray&amp; Paxinum提供了您需要的指南。您所要做的就是调整它以适合您的情况。

但是如果出于学术目的而你的讲师需要看到你的详细脚本, 你可能会考虑这个。请注意,使用ArrayList而不是Array,因为 与后者不同,前者的限制可以重新定义。 您可以复制并粘贴以下代码,看看它是如何工作的。考虑将其编辑为 如果需要你的规格。我也提供了评论 - 他们尽可能多地解释代码。干杯!

import java.util.ArrayList; 
import java.util.Scanner; 

public class SeriesTest 
{

// This internal class "Index", will represent an index Object that holds a
// value and returns the value when needed 
    class Index
    {
        private double idxElement;

        private void setIdxElement(double value)
        {
            idxElement = value;
        }

        private double getIdxElement()
        {
            return idxElement;
        }
    }

// Create an Object index of type Index (i.e the class defined above)
Index index;

// Create an ArrayList, x_ , that will reference the index Objects.
ArrayList<Index> x_ = new ArrayList<Index>();

public void calculateResult()
{
    System.out.println("How many elements do you want the series to have?");
    Scanner input = new Scanner(System.in);
    int NoOfelements = input.nextInt();

    int value = 0;

    // create a new instance of type Index
    index = new Index();

    // set the element held by this index as 0(zero)
    // You can set this to any value depending on your Series' requirements
    index.setIdxElement(value);

    /*add the index object to the ArrayList
     *This represents your x_m 
     *Note - This references the index Object that holds the value = 0 )*/
    x_.add(index);

    /* To do the same thing for the rest of the elements using 
     * your specified equation ---> x_m = 1/[ 1 + x_(m-1) ]*/
    for (int m = 1; m < NoOfelements; m++ )
    {
        index = new Index();
        // sets the value of the element referenced by the index object
        // This represents your x_m = 1/[ 1 + x_(m-1) ]
        index.setIdxElement( 1 / ( 1 + x_.get(m - 1).getIdxElement() ) );

        // adds the index object to the ArrayList
        x_.add(index);
    }
}

public void displayResults()
{
    // displays the series as referenced by the the ArrayList
    // Note - ArrayList indexes start at 0(zero)
    System.out.println("The series is:");
    for ( int n = 0; n < x_.size(); n++ )
    {
        System.out.printf( "%.2f, ", x_.get(n).getIdxElement() );
    }
}
public static void main(String[] args) 
{
    SeriesTest series = new SeriesTest();
    series.calculateResult();
    series.displayResults();
}

}