2017-11-28 22 views
0

방정식에서 최소 및 최대 출력을 얻으려면 .Net에 기본 제공 함수가 있는지 묻고 싶습니다. 예를 들어방정식의 출력 범위를 얻으십시오.

float a,b,c,d,e,f,g; 

float result() { 
return a*b/c + d/(e-d) + f/g; 
} //how to know the possible min and max value of result()? 

I 도메인 알 (A, B, C, D, E, F의 최소 및 최대, g을 반응시켜, (ED), g가 0이 아닌 경우)는 어떻게 얻을 결과의 범위()? 지금까지 수동으로 중첩 루프를 실행 해 보았습니다 : figure: Output range of a function (< - 그림 참조). 하지만 내가 원하는 것은 더 빠른 계산입니다 (아마도 built-in function?). 코드는 해당 이미지의 결과를 생성합니다 : 내가 잘못 키워드를 요구하는 경우

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace TEST { 
    class Program { 
     static void Main(string[] args) { 
      ThreatRange(); 
      Console.ReadLine(); 
     } 
     static void ThreatRange() { 
      int a0 = 1, a1 = 10; // I know the min and max value for each variable 
      int b0 = 1, b1 = 10; 
      int c0 = 1, c1 = 10; 
      int d0 = 1, d1 = 10; 
      int e0 = 1, e1 = 10; 
      int f0 = 1, f1 = 10; 
      int g0 = 1, g1 = 10; 

      float threat = 0, threatmin = 9999, threatmax = 0; 

      for (int a = a0; a <= a1; a++) { 
       for (int b = b0; b <= b1; b++) { 
        for (int c = c0; c <= c1; c++) { 
         for (int d = d0; d <= d1; d++) { 
          for (int e = e0; e <= e1; e++) { 
           for (int f = f0; f <= f1; f++) { 
            for (int g = g0; g <= g1; g++) { 
             threat = a * b/(float)c + d/(float)Math.Max(1, Math.Abs(e - d)) + (d/(float)Math.Max(1, Math.Abs(e - d))) * (f/g); 
             // I want to know the min and max output from the equation above 
             if (threat < threatmin) threatmin = threat; 
             if (threat > threatmax) threatmax = threat; 
             Console.WriteLine(a + "," + b + "," + c + "," + d + "," + e + "," + f + "," + g); 
             Console.WriteLine("Min: " + threatmin + ". Max: " + threatmax); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

실례를, 내가하지 영어를 모국어 야도 내 수학이 좋다. 당신이 나에게 C#을 이외의 솔루션을 제공 할 수있는 도구를 알고 있다면 :( 는 말씀 해주십시오.

+3

심지어 알고리즘이 존재하는 경우가 꽤 도전, 임의의 함수의 최소 및 최대를 얻을 것이라는 점에 유의하시기 바랍니다도 당신의 코드. 하지만 당신이'List '또는'array'를 사용할 수 있다고 생각합니다. –

+0

@MohitShrivastava는 많은 매개 변수를 가진 방정식의 최소 및 최대 출력 값을 알고 싶다고합시다. 많은 중첩 된 루프를 사용하는 것보다 더 좋은 방법이 있습니까? –

+0

예 .. 목록이나 배열에 입력을 넣으면 중첩 루프 대신 LINQ ...를 사용할 수 있습니다. 그리고 그것이 하나의 라이너 또는 2가 될 것이라고 믿습니다. –

답변

1

를 우리는 다음의 극단적 인 값 (최소 및 최대) 이후이다.

a*b/c + d/(e-d) + f/g; 

에서 이 경우는. 당신이 각각 A, B, C, D, E, F, G의 범위를 알 상기 때문이다. 우리는 글로벌 최대 얻을 수있는 각 부품에 대한 로컬 최대 값을 얻기 때문에

Max(a*b/c) + Max(d/(e-d)) + Max(f/g); 

경우
A = Max(a*b/c) = Max(a) * Max(b)/Min(c) 
B = Max(d/(e-d)) = Max(d)/(Max(e) - Min(d)) 
C = Max(f/g)  = Max(f)/Max(g) 

X = Min(a*b/c) = Min(a) * Min(b)/Max(c) 
Y = Min(d/(e-d)) = Min(d)/(Min(e) - Max(d)) 
Z = Min(f/g)  = Min(f)/Min(g) 

따라서

Max = A + B + C 
Min = X + Y + Z 

그러나 나는 당신의 질문을 이해 didnt는 그