2016-11-30 131 views
3

我們的老師讓我們用C#做一個梯形法則的解決方案; 他希望我們把它分解成三種方法。 下面是這個問題,到目前爲止我的代碼:C#梯形法則y值的總和

數值積分是一種技術,是特別適合 計算機應用。在練習中,我們將嘗試實施 梯形法則。數學函數的積分是曲線和x軸之間的區域 。如果該區域被分成很少的梯形,則積分近似於這些幾何圖形的面積。

你會嘗試找到從x = 0.5到x = 1.5的 區域的曲線y = 6x^2-7x + 2下的面積(注意,你的答案應該爲 約爲1.54,但是實際答案是1.5)。區域由 給出的公式
​​

其中y 0和y是垂直線即 函數的值的高度。

  • 寫稱爲EvaluateQuadraticValue(雙X,雙一,雙B,雙c),其採用四個雙參數方法:x的值

    如下此問題可以分解成三個部分, 係數x2項,係數x和
    不變。該方法將計算並返回由表達式y = ax2 + ba + c所給出的結果值y

  • 寫方法稱爲ComputeQuadraticValues(雙STARTX,雙增量,整數numberOfIntervals,雙一,雙B,雙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()的double數組是x0,x1,x2等。我該如何使用這個數組來獲得(y0 + 2 * y1 + 2 * y2 + ...... + 2 * yn + y(n + 1) ))?

任何提示或技巧,讚賞!

回答

2

我同意@MartinLiversage,也認爲在excersise中還有一些其他棘手的部分。我會盡我所能給你一個很好的答案。讓我知道這是如何爲你工作的。

這是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

非常感謝!我嘗試了另一種方法,它也起作用(仍然需要確認),使用「out」輸出y數組並將其放入第三個方法中。我很感激! –

1

對我而言ComputeQuadraticValues的描述很混亂。如果它返回y0,y1,y2等而不是x0,x1,x2等,如上所述是有意義的。

看看你的代碼ComputeQuadraticValues你叫EvaluateQuadraticValue(它計算y給出x)。但是,計算出的y值不會存儲在任何地方。您可以將xPoints重命名爲yPoints,然後將計算後的y值存儲在該數組中,然後將其作爲該函數的結果返回。

隨着這一變化,你應該可以編寫一個工作版本ApplyTrapeziodalRule

+0

謝謝,我會試試看! –