C/C++ C++ simpson's method -loop doesn't stop

  • Thread starter Thread starter ggeo1
  • Start date Start date
  • Tags Tags
    C++ Method
AI Thread Summary
The discussion centers around a C++ implementation of Simpson's method for numerical integration, where the main issue is that the loop for calculating the integral does not terminate as expected. The user initially defines an accuracy threshold and an exact solution but fails to update the error variable within the loop, causing the loop condition to remain true indefinitely. Key points include the incorrect use of a double in the loop condition, which prevents the even-indexed summation from executing correctly when `n` is odd. Suggestions are made to change the increment of `n` from `n++` to `n *= 2`, which leads to correct behavior by ensuring that `n` remains even, as required by Simpson's method. The user also shares updated code and output, highlighting that the method produces accurate results at even steps but continues to iterate unnecessarily. The conversation emphasizes the importance of correctly managing loop conditions and ensuring that the number of intervals used in Simpson's method is even for accurate calculations.
ggeo1
Messages
61
Reaction score
0
c++ simpson's method --loop doesn't stop

Hello, i have done the simpson's method and it works fine.My problem is that it doesn't stop when it gives me the desired result but the loop continues for ever..

Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>

using namespace std;

double f(double x){
double y;
y=sqrt(x-0.1);
return y;

}

double simpson (double down,double up,int n){

    double h,sumeven,sumodd,all,result;

    h=(up-down)/n;
     sumeven=0.0;
    for (int i=1;i<=n/2.0-1.0;i++){

        sumeven+=f(down+2.0*i*h);//coefficients

    }
    sumodd=0.0;
    for (int i=1;i<=n/2.0;i++){
     sumodd+=f(down+h*(2.0*i-1.0));//coefficients

    }


    all=4*sumodd+2*sumeven;

    result=(h/3.0)*(f(down)+f(up)+all);
    return result;

}


int main()
{
    double eps=1e-6;//accuracy
    double exact=1.1767695;//exact solution for the integral
    double error=1.0;
    double result;

    int n=1;//initial point
    result=simpson(1.0,2.0,n);

    while (fabs(error-exact)>eps) {
        result=simpson(1.0,2.0,n);
        cout <<"\nFor n = "<<n<<",error = "<<fabs(error-exact)<<",value = "<<result;

    n++;
    }

    return 0;
}

I have done other methods too like that and they stop,but this one not.

Thanks!
 
Technology news on Phys.org


In your main function, you define

Code:
    double eps=1e-6;//accuracy
    double exact=1.1767695;//exact solution for the integral
    double error=1.0;

but then in your while-loop you don't change any of those variables, so the condition 'fabs(error-exact)>eps' is always true.
 
Last edited:


This loop looks flaky to me.
Code:
for (int i=1;i<=n/2.0-1.0;i++){
        sumeven+=f(down+2.0*i*h);//coefficients
}
In the first iteration of the while loop in main, n is 1, so the test expression in the for loop above is false, so the for loop doesn't execute.

When n == 1, n/2.0 - 1.0 is 0.5 - 1.0 == -.5, and i <= -.5 is false. You should not have to compare the counter in the for loop (i) with a double.
 


Hello,you are right but

if i do :

Code:
 int n=1;//initial point
    result=simpson(1.0,2.0,n);

    while (fabs(result-exact)>eps) {
        result=simpson(1.0,2.0,n);
        cout <<"\nFor n = "<<n<<",error = "<<fabs(result-exact)<<",value = "<<result;

    n++;
    }

then the loop stops at step n=8 ,but the problem is that at step n=2 it gives me the right solution and then goes over again.
 


Ok, i changed the for loops : for (int i=1;i<=n/2-1;i++)
for (int i=1;i<=n/2;i++)
(it was a mistake ,i didn't want to insert double values in the loops!)

But now again , it gives me the exit as a say above..
 


I think that you are not using Simpson's Rule correctly. Each time you call simpson(), the 3rd argument should be an even integer.

In each iteration of Simpson's Rule the interval [a, b] should be broken up into an even number of subintervals.
 


I used the same code in mathematica and it works fine.It gives me the right answer after 2 iterations.The same is happening here but it continues to step 8.(it gives me the right result every "even" steps)..
 


Instead of incrementing n by 1 in each while loop iteration, try doubling n each time.

So instead of doing this: n++;
Do this: n *= 2;

See if that makes a difference.

You've changed your code since the first post. Can you show us what you have now?
Also, it would help to see the exact output.
 


Here is my code :

Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>

using namespace std;

double f(double x){
double y;
y=sqrt(x-0.1);
return y;

}

double simpson (double down,double up,int n){

    double h,sumeven,sumodd,all,result;

    h=(up-down)/n;
     sumeven=0.0;
    for (int i=1;i<=n/2-1;i++){

        sumeven+=f(down+2.0*i*h);//coefficients

    }
    sumodd=0.0;
    for (int i=1;i<=n/2;i++){
     sumodd+=f(down+h*(2.0*i-1.0));//coefficients

    }


    all=4*sumodd+2*sumeven;

    result=(h/3.0)*(f(down)+f(up)+all);
    return result;

}


int main()
{
    double eps=1e-6;//accuracy
    double exact=1.1767695;//exact solution for the integral
    double error=1.0;
    double result;

    int n=1;//initial point
   

    while (fabs(result-exact)>eps) {
        result=simpson(1.0,2.0,n);
        cout <<"\nFor n = "<<n<<",error = "<<fabs(result-exact)<<",value = "<<result;

    n++;
    }

    return 0;
}

and the exit is :

For n = 1,error = 0.401073,value = 0.775696
For n = 2,error = 0.000110833,value = 1.17666
For n = 3,error = 0.424624,value = 0.752146
For n = 4,error = 8.23034e-06,value = 1.17676
For n = 5,error = 0.263326,value = 0.913444
For n = 6,error = 1.67268e-06,value = 1.17677
For n = 7,error = 0.190651,value = 0.986119
For n = 8,error = 5.17684e-07,value = 1.17677


If i use n*=2 instead of n++ ,it gives :

For n = 1,error = 0.401073,value = 0.775696
For n = 2,error = 0.000110833,value = 1.17666
For n = 4,error = 8.23034e-06,value = 1.17676
For n = 8,error = 5.17684e-07,value = 1.17677

which is the same but with step 2 of course.
 

Similar threads

Replies
5
Views
3K
Replies
17
Views
2K
Replies
39
Views
4K
Replies
35
Views
4K
Replies
22
Views
3K
Replies
1
Views
2K
Back
Top