C#梯形规则y值的和

时间:2016-11-30 00:24:20

标签: c#

我们的老师要求我们使用C#来做一个梯形规则解决方案; 他希望我们将其分解为三种方法。 以下是目前的问题和我的代码:

  

数值积分是一种特别适合的技术   电脑应用。在练习中,我们将尝试实施   梯形规则。数学函数的积分是面积   在曲线和x轴之间。如果该区域分为少   梯形,然后积分近似于这些的面积   几何图形。

     

您将尝试在曲线下找到y = 6x ^ 2-7x + 2的区域   区域从x = 0.5到x = 1.5(N.B.你的答案应该适用于   约为1.54,但实际答案是1.5)。该地区由   公式
  (xb - xa) / 2N * (y0 + 2*y1 + 2*y2 + ⋯ + 2*yn + y(n+1))

     

其中y0和y1是垂直线的高度,即值   功能。

     

这个问题可以分解为如下三个部分:

     
      
  • 编写一个名为EvaluateQuadraticValue(double x,double a,double b,double c)的方法,它接受四个双参数:x的值,   x2项的系数,x和z的系数   不变。该方法将计算并返回y
    的结果值   由表达式y = ax2 + ba + c。

  • 给出   
  • 编写一个名为ComputeQuadraticValues的方法(double startX,double incrementments,int numberOfIntervals,double a,double b,double c)   有六个参数:x的起始值,增量和
      间隔数和二次方程的系数   此方法将通过调用计算出x0,x1,x2等的值   上一个问题。收集方法调用的结果   并作为双数组返回。

  •   
  • 编写一个名为ApplyTrapeziodalRule的方法(double startX,double endX,int numberOfIntervals,double a,double b,double c)。该
      参数在前一个问题中描述。这种方法称为   上一个方法并处理返回到的双数组   通过应用公式计算曲线下面积   (xb - xa) / 2N * (y0 + 2*y1 + 2*y2 + ⋯ + 2*yn + y(n+1))

  •   

到目前为止我的代码:

    public static double EvaluateQuadraticValue(double x, double a, double b, double c)
    {
        double y = a * Math.Pow(x, 2) + b * x + c;
        Console.WriteLine("The y coordinate for this x is: {0}", y);
        return y;
    }

    public static double[] ComputeQuadraticValues(double startX, double increments, int numberOfIntervals, double a, double b, double c)
    {

        double[] xPoints = new double[numberOfIntervals];
        for (int index = 0; index < numberOfIntervals; index++)
        {
            xPoints[index] = startX;
            Console.WriteLine("X{0} is {1}: ",index, xPoints[index]);
            EvaluateQuadraticValue(startX, a, b, c);
            startX = startX + increments;
        }
        return xPoints;
    }

    public static void ApplyTrapeziodalRule(double startX, double endX, int numberOfIntervals, double a, double b, double c)
    {
        double increments = Convert.ToInt32(Console.ReadLine());
        double[] xPoints = ComputeQuadraticValues(startX, increments, numberOfIntervals, a, b, c);
        //double[] values = a * Math.Pow(xPoints[i], 2) + b * xPoints[i] + c;
        //double y = xPoints.Sum();
        /*for (int i = 0; i < numberOfIntervals; i++)
        {

        }*/
        //Console.WriteLine(y + " sum");
    }

目前我遇到了第三种方法的问题。 由于ComputeQuadraticValues()的双数组是x0,x1,x2等。我如何使用此数组得到(y0 + 2 * y1 + 2 * y2 + ...... + 2 * yn + y( N + 1))?

任何提示或提示都表示赞赏!

2 个答案:

答案 0 :(得分:2)

我同意@MartinLiversage,并且认为在例外情况中还有一些其他棘手的部分。我会尽力给你一个好的答案。让我知道这对你有用。

这是由6x^2-7x+2代表的曲线,您需要以蓝色计算区域:

enter image description here

你正在做的是一种数值方法,其背后的逻辑是,如果你设法将区域分成无限多个点,你就可以更准确地得到总面积。您添加的点越多,结果就越准确。

问题是,在计算机科学中,无限是不可能的,因为资源是有限的,最终你需要设置一个限制。

我将10设置为间隔数(N),这样您就可以得到11分并且样本可读。

现在,您的第一个方法就是帮助器,以便以ax ^ 2 + bx + c的形式评估函数。

public static double EvaluateQuadraticValue(double x, double a, double b, double c)
{
    double y = a*Math.Pow(x,2) + b*x + c;
    return y;
}

第二个是我认为问题所在。我实现它是这样的:

public static double[] ComputeQuadraticValues(double startX, double increments, int numberOfIntervals, double a, double b, double c)
{
    //We need numberOfInterval + 1 values
    double[] yPoints = new double[numberOfIntervals+1];

    for (int index = 0; index <= numberOfIntervals; index++, startX += increments)
    {
        //evaluate the function and get the y value for this x
        yPoints[index] = EvaluateQuadraticValue(startX, a, b, c);
        //Console.WriteLine("({0}, {1})", startX, yPoints[index]);
    }

    return yPoints;
}

最后一个是你的Main()函数调用的那个:

public static void ApplyTrapezoidalRule(double startX, double endX, int numberOfIntervals, double a, double b, double c)
{
    double increments = (endX - startX)/numberOfIntervals;
    Console.WriteLine("increment: " + increments);

    //compute the function value for each X (generated from startX + increment).
    double[] yPoints = ComputeQuadraticValues(startX, increments, numberOfIntervals, a, b, c);

    var first = (double)(endX - startX)/(2*numberOfIntervals);
    Console.WriteLine("({0} - {1})/2*{2} = {3}", endX, startX, numberOfIntervals, first);

    var sum = yPoints[0];
    for (int i = 1; i <= numberOfIntervals; i++)
        sum += 2 * yPoints[i];
    sum += yPoints[numberOfIntervals];

    var result = first * sum;

    Console.WriteLine("result: " + result);
}

我已经声明了更多变量,因此您将看到该过程,并且代码再次更具可读性。

您可以看到this fiddle并使用您传入的numberOfIntervals。请注意,如果增加间隔数,该值将更准确。

希望这有帮助!

答案 1 :(得分:1)

对我而言ComputeQuadraticValues的描述令人困惑。如果返回y0,y1,y2等而不是x0,x1,x2等,则有意义。

查看ComputeQuadraticValues的代码,调用EvaluateQuadraticValue(计算给定的x)。但是,计算出的y值不会存储在任何地方。您可以将xPoints重命名为yPoints,然后将计算出的y值存储在该数组中,然后再将其作为函数的结果返回。

通过该更改,您应该能够编写ApplyTrapeziodalRule的工作版本。