我们的老师要求我们使用C#来做一个梯形规则解决方案; 他希望我们将其分解为三种方法。 以下是目前的问题和我的代码:
数值积分是一种特别适合的技术 电脑应用。在练习中,我们将尝试实施 梯形规则。数学函数的积分是面积 在曲线和x轴之间。如果该区域分为少 梯形,然后积分近似于这些的面积 几何图形。
您将尝试在曲线下找到y = 6x ^ 2-7x + 2的区域 区域从x = 0.5到x = 1.5(N.B.你的答案应该适用于 约为1.54,但实际答案是1.5)。该地区由 公式
其中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)。该
参数在前一个问题中描述。这种方法称为 上一个方法并处理返回到的双数组 通过应用公式计算曲线下面积
到目前为止我的代码:
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))?
任何提示或提示都表示赞赏!
答案 0 :(得分:2)
我同意@MartinLiversage,并且认为在例外情况中还有一些其他棘手的部分。我会尽力给你一个好的答案。让我知道这对你有用。
这是由6x^2-7x+2
代表的曲线,您需要以蓝色计算区域:
你正在做的是一种数值方法,其背后的逻辑是,如果你设法将区域分成无限多个点,你就可以更准确地得到总面积。您添加的点越多,结果就越准确。
问题是,在计算机科学中,无限是不可能的,因为资源是有限的,最终你需要设置一个限制。
我将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
的工作版本。