2016-11-30 2 views
3

선생님은 우리에게 사다리꼴 규칙 솔루션을 수행하기 위해 C#을 사용하도록 요청했습니다. 그는 우리가 세 가지 방법으로 나누기를 원합니다. 아래는 문제이며, 지금까지 내 코드 :y 값의 사다리꼴 규칙 합계

수치 통합 컴퓨터 응용 프로그램에 특히 적합한 기술이다. 운동시 우리는 사다리꼴 규칙을 구현하려고합니다. 수학 함수의 적분은 곡선과 x 축 사이의 영역 입니다. 면적이 조금 작은 사다리꼴로 나뉘어지면, 적분은이 의 기하학적 형상의 면적으로 근사됩니다.

당신은 약하지만, 1.54 일 = 6 배는^2-7x + 2 지역에서 X = 0.5 X = 1.5 (NB는 당신의 대답은 에 해결해야 할 곡선 y를 아래의 면적을 찾기 위해 노력할 것입니다 실제 응답은 1.5입니다.) 지역은 하여 화학식
Y0 및 Y1 즉 함수의 값 수직선의 높이이다 (xb - xa)/2N * (y0 + 2*y1 + 2*y2 + ⋯ + 2*yn + y(n+1))

주어진다. x의 값 :

  • 가 EvaluateQuadraticValue (더블 X, 이중 A, 이중 B, 이중 c) 네 이중 인자를 호출하는 방법을 적는다 다음

    이 문제는 세 부분으로 분해 될 수있다 , x2 항의 계수, x의 계수 및
    상수. 메서드는 y = ax2 + ba + c라는 식으로 주어진 y 값이
    인 값을 계산하여 반환합니다.

  • 방법이라고 ComputeQuadraticValues ​​ 여섯 개 인수 소요 (더블 STARTX 이중 단위, numberOfIntervals를 INT, 이중 A, 이중 B, 이중 c) 작성, X 개시 값은 증가시키고 간격의
    수가 및 이차 방정식의 계수.
    이 방법은 이전 질문 인 을 호출하여 x0, x1, x2 등의 값을 계산합니다. 메서드 호출의 결과는 으로 수집되어 double 배열로 반환됩니다.

  • 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))

그리고 내 코드를 적용하여 곡선 아래의 면적을 계산
이전 메서드를 호출하고
에 반환되는 double 배열을 처리

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

이 수치 방법을, 그리고 뒤의 논리는 당신의 경우 무한한 수의 포인트로 영역을 분할하면 더 정확하게 전체 면적을 얻을 수 있습니다. 추가하는 포인트가 많을수록 결과가 더 정확 해집니다.

컴퓨터 과학에서 무한대는 불가능합니다. 리소스가 제한되어 결국 제한을 설정해야하기 때문입니다.

나는 11 점을 얻고 샘플을 읽을 수 있도록 간격 (N)의 수를 10으로 설정했습니다.

이제 첫 번째 방법은 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; 
} 

을 그리고 마지막은 홈페이지() 함수에 의해 호출되는 하나입니다 :이처럼 구현하는 것 당신이를 볼 수 있도록 좀 더 변수를 선언 한

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

정말 고마워요! 나는 또 다른 접근법을 시도했다. (그래도 여전히 확인이 필요하다.) y 배열을 출력하기 위해 "out"을 사용하고 세번째 방법을 사용한다. 나는 매우 감사한다! –

1

내게는 ComputeQuadraticValues의 설명이 혼란 스럽습니다. 명시된대로 x0, x1, x2 등이 아닌 y0, y1, y2 등을 반환하면 의미가 있습니다.

ComputeQuadraticValues에 대한 코드를 보면 EvaluateQuadraticValue (y가 x라고 계산 됨)이라고 부릅니다. 그러나 계산 된 y 값은 아무 곳에도 저장되지 않습니다. xPointsyPoints으로 바꾼 다음 계산 결과를 해당 배열에 저장 한 다음 함수의 결과로 반환 할 수 있습니다.

그런 변경으로 ApplyTrapeziodalRule의 작업 버전을 작성해야합니다.

+0

감사합니다. –