Неожиданный результат в интеграции функции - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь создать программу, которая вычисляет интеграл x x с определенными ограничениями, но кажется, что когда я запускаю код, результат кажется неправильным. Например, интеграл от x x с пределами 0 и 1 должен быть около 0,7834, а результат моей программы показывает 0,372762

Можете ли вы помочь мне разобраться в проблеме?

Следующий код компилируется без предупреждений или ошибок.

#include <stdio.h>
#include <math.h>

int main() {
    double a,b,c;
    int i;
    c=0;
    printf("Insert limit 1:");
    scanf("%lf",&a);
    printf("Insert limit 2:");
    scanf("%lf",&b);
    for( i = 0; i < ((b-a)*1000); i = i + 1 ){
      c=c+0.001*pow(a,a);
      a=a+0.001;
   }
   printf("The area is %lf", c);
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Переформировать for() цикл для итерации и точного целое число количество раз.

OP;код изменяет a каждый цикл, поэтому i < ((b - a) * 1000 не приводит к правильному счету итераций. @ Михаил

#include <stdio.h>
#include <math.h>

int main() {
  double a, b, c;
  int i;
  c = 0;
  printf("Insert limit 1:\n");
  a = 0; //scanf("%lf",&a);
  printf("Insert limit 2:\n");
  b = 1.0; /// scanf("%lf",&b);
#if 0
  for (i = 0; i < ((b - a) * 1000); i = i + 1) {
    c = c + 0.001 * pow(a, a);
    a = a + 0.001;
  }
#else
  double delta = (b - a) / 1000;
  for (i = 0; i < 1000; i = i + 1) {
    c = c + delta * pow(a, a);
    a = a + delta;
  }

#endif
  printf("The area is %lf\n", c);
  return 0;
}

Выход

The area is 0.783431
1 голос
/ 09 марта 2019

Тело цикла изменяет a, которое затем повторно оценивается в цикле for, где оно должно быть инвариантным к циклу. Измените тело цикла с:

  c=c+0.001*pow(a,a);
  a=a+0.001;

до

  double x = i * 0.001 ;
  c += 0.001 * pow( x, x ) ;

Фактически вы можете упростить это, используя x в качестве переменной управления циклом:

const double dx = (b - a) / 1000 ;
for( double x = a; x < b; x += dx )
{
    c += 0.001 * pow( x, x ) ;
}

Дальнейшее умножение на 0,001 на каждой итерации не требуется; Вы можете применить это после цикла к тому же эффекту и в некоторых случаях меньше накопленной ошибки.

const double dx = (b - a) / 1000 ;
for( double x = a; x < b; x += dx )
{
    c += pow( x, x ) ;
}
c *= dx  ;

Таким образом, полный код становится:

#include <stdio.h>
#include <math.h>

int main() 
{
    double a = 0 ;
    double b = 1.0 ;
    printf( "Enter limit 1:");
    scanf(  "%lf", &a ) ;
    printf( "Enter limit 2:");
    scanf( "%lf", &b ) ;

    const double dx = (b - a) / 1000 ;
    double c = 0 ;
    for( double x = a; x < b; x += dx )
    {
        c += pow( x, x ) ;
    }
    c *= dx  ;

    printf( "The area is %lf", c )  ;
    return 0;
}

Пример:

Enter limit 1:0                                                                                                                                          
Enter limit 2:1                                                                                                                                          
The area is 0.783431                                                                                                                                     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...