Ввод файла C / Программа правил трапеции - PullRequest
0 голосов
/ 29 ноября 2010

Немного 2 участника. Прежде всего я пытаюсь сделать это во всем в. Прежде всего, я отправлю свою программу

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
#include <string.h>

double f(double x);    
void Trap(double a, double b, int n, double* integral_p);

int main(int argc, char* argv[]) {

   double  integral=0.0;  //Integral Result
   double  a=6, b=10;   //Left and Right Points
   int    n;     //Number of Trapezoids (Higher=more accurate) 
   int degree;

  if (argc != 3) {
      printf("Error: Invalid Command Line arguements, format:./trapezoid N filename");
      exit(0);
   }
   n = atoi(argv[2]);

   FILE *fp = fopen( argv[1], "r" );

#  pragma omp parallel 
   Trap(a, b, n, &integral);
   printf("With n = %d trapezoids....\n", n);
   printf("of the integral from %f to %f = %.15e\n",a, b, integral);
   return 0;
}  

double f(double x) {
   double return_val;
   return_val = pow(3.0*x,5)+pow(2.5*x,4)+pow(-1.5*x,3)+pow(0*x,2)+pow(1.7*x,1)+4;
   return return_val;
}  
void Trap(double a, double b, int n, double* integral_p) {
   double  h, x, my_integral;
   double  local_a, local_b;
   int  i, local_n;
   int my_rank = omp_get_thread_num();
   int thread_count = omp_get_num_threads();

   h = (b-a)/n;
   local_n = n/thread_count;
   local_a = a + my_rank*local_n*h;
   local_b = local_a + local_n*h;
   my_integral = (f(local_a) + f(local_b))/2.0;
   for (i = 1; i <= local_n-1; i++) {
     x = local_a + i*h;
     my_integral += f(x);
   }
   my_integral = my_integral*h;

#  pragma omp critical
   *integral_p += my_integral;
}  

Как видите, он вычисляет трапецеидальное правило с заданным интервалом. Прежде всего, это работает, если вы жестко закодировали значения и функцию. Но мне нужно читать из файла в формате

5
3.0 2.5 -1.5 0.0 1.7 4.0
6 10

Что означает: Степень 5 (не более 50) 3.0x ^ 5 + 2.5x ^ 4 −1.5x ^ 3 + 1.7x + 4 - это многочлен (мы пропускаем ^ 2, так как это 0) и интервал от 6 до 10

Моя главная проблема - функция f (x), которую я жестко закодировал. У меня НЕТ ИДЕИ, как сделать так, чтобы это заняло до 50, кроме буквального ввода 50 POWS и чтения значений, чтобы увидеть, какими они могут быть ....... У кого-нибудь еще есть идеи?

Кроме того, что будет лучшим способом для чтения в файле? fgetc? Я не совсем уверен, когда дело доходит до чтения на входе C (тем более, что все, что я читаю, это INT, есть ли какой-нибудь способ их преобразовать?)

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

Для полинома большой степени что-нибудь вроде этой работы?

double f(double x, double coeff[], int nCoeff)
{
    double return_val = 0.0;
    int exponent = nCoeff-1;

    int i;
    for(i=0; i<nCoeff-1; ++i, --exponent)
    {
        return_val = pow(coeff[i]*x, exponent) + return_val;
    }
    /* add on the final constant, 4, in our example */
    return return_val + coeff[nCoeff-1];  
}

В вашем примере вы бы назвали это следующим образом:

sampleCall()
{
    double coefficients[] = {3.0, 2.5, -1.5, 0, 1.7, 4};
    /* This expresses 3x^5 + 2.5x^4 + (-1.5x)^3 + 0x^2 + 1.7x + 4 */
    my_integral = f(x, coefficients, 6);
}

Передавая массив коэффициентов (предполагаются показатели), вам не нужно иметь дело с переменными аргументами. Самое сложное - это создание массива, и это довольно просто.


Само собой разумеется, если вы помещаете массив коэффициентов и число коэффициентов в глобальные переменные, тогда сигнатура f (x) не должна изменяться:

double f(double x)
{
   // access glbl_coeff and glbl_NumOfCoeffs, instead of parameters
}
0 голосов
/ 29 ноября 2010

Для вашей функции f () рассмотрите возможность сделать ее вариативной (varargs - это другое имя)

http://www.gnu.org/s/libc/manual/html_node/Variadic-Functions.html

Таким образом, вы можете передать функцию 1, сообщая, сколько "pow" вы хотите, с каждым последующимаргумент, являющийся двойным значением.Это то, что вы просите с помощью функции f () вашего вопроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...