Интегральная аппроксимация C — для добавления функции цикла

#c

#c

Вопрос:

Пожалуйста, потерпите меня, поскольку я новичок в кодировании. Я пытаюсь приблизить интеграл 4 / (1 x ^ 2) от 0 до 1, используя C . Я должен использовать формулу: P = 1 / n [сумма от i до n-1: f (x)] с x = (i 0,5) / n и i равно 0, 1, 2, 3…. n-1. В частности, я борюсь с написанием части кода для добавления f (x) для каждого значения x и i. Это можно увидеть в цикле for в нижней части кода. Я продолжаю вычислять значение 0, но этот интеграл должен приближаться к pi. Заранее благодарю вас. Ниже приведен мой код.

 // Definite Integral using Quadrature Method
// As N increases, P approaches pi.
#include<iostream>
#include<cmath>
#include <iomanip>
#include <cstdlib>
#include <time.h>


using namespace std;
double func(double x)        
{
double func = 4 /(1 x*x); // define function func = 4 / (1  x^2) to be integrated
return func;
}

int main(int argc, char **argv) {
if (argc < 2) {
std::cout << argv[0] << "n";
return 0;
}

int n = std::atoi(argv[1]);  // n is number of subintervals
std::cout << "n=" << n << std::endl;
std::cout << std::setprecision(16);


// P = (1/n)*[sum func((i 0.5)/n] with i = 0,1,2,3,... N-1 
int i;
double s, x;
for ( i=0; i<=(n-1); i  )          
{                
  x = (i   0.5) / n;
  s = func(x);
  x  = x;
  s  = s;
     
 }


 double P = (1/n)*s;
  cout<< P;
  return 0;
  }
  

Комментарии:

1. 1/n : целочисленное деление, равное 0. Более того, сумма не инициализируется

Ответ №1:

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

Вы можете написать цикл следующим образом:

 double s = 0;
for ( i=0; i<=(n-1); i  )          
{             
  double x = (i   0.5) / n;
  s  = func(x);     
}
  

Во-вторых, это вычисление, 1/n когда вы вычисляете P , неверно. Это будет выполнять целочисленное деление, и вы получите, 0 когда n больше 1 . Вместо этого вам нужно сделать 1./n . Вы также могли бы просто сделать:

 double P = s/n;
  

Вот демонстрация.