Используя метод Эйлера, постройте приближенное решение задачи Коши с заданной точностью

#c #math #task

Вопрос:

Пожалуйста, помогите с пунктами 5 и 8 (проблема описана в комментарии в коде). Здесь задача:

Использование метода Эйлера для построения приближенного решения задачи Коши с заданной точностью.

Напишите программу, которая вычисляет приблизительное значение решения задачи Коши.

  1. Начальное условие (a и s (y(a)=s)) должно быть введено с клавиатуры.
  2. Точка, в которой рассчитывается приблизительное значение (b), должна быть введена с клавиатуры.
  3. Если внутри или на границах интервала [a, b] функция имеет точки останова (точки, которые не входят в Допустимую область), на экране должно отображаться сообщение с предложением ввести новый интервал. Допустимый регион может быть рассчитан вручную для вашего конкретного варианта.
  4. Допустимая погрешность расчета должна быть введена с клавиатуры.
  5. Первое приближение должно быть рассчитано для n = 1. Затем при вычислении каждого следующего итерационного значения количество сегментов следует увеличивать, деля интервал на 1.
  6. Итерационный процесс стоит остановить, если модуль разности между двумя последними приближениями меньше указанной погрешности.
  7. Если n превышает 10000, а требуемая точность не достигнута, отобразите текущий ответ и текущую ошибку с пометкой «Не удалось достичь указанной точности».
  8. На экране должно отображаться последнее итоговое значение (окончательный ответ), округленное в соответствии с ошибкой, а также требуемое количество итераций.
      #include <math.h>
     #include <stdio.h>
    
     //round y
     double round_y(double y, int count) {
             return round(y * pow(10, count)) / pow(10, count);
         }
     //function
     const double f(double x, double y){
         return 2.0*x*sqrt(y)-y;  
     }
    
     int main(){
         int i, n;
         double y, xi, yi, h, a, b, s, eps;
         printf("Enter value a = ");
         scanf("%lf",amp;a);
          xi=a;
    
         printf("Enter value b = ");
         scanf("%lf",amp;b);
    
         printf("Enter value s = ");
         scanf("%lf",amp;s);
          yi=s;
    
         printf("Enter value eps = ");
         scanf("%lf",amp;eps); 
    
         //Here the problem item 8
         //There should be a function here for
         //counting decimal places in error for further rounding
         //but for example I just write by myself count
         int count = 1;
    
     //Euler's method
     n=1; //Here the problem item 5 (iterations always is 1)
     int iter_count = 0;
     while(xi<n){       
         h=(b-a)/n;
         y=yi h*f(xi,yi);
         iter_count=iter_count 1;
         //printf("ny = %lfn", y);
         if (fabs(y-yi)<eps){
           printf("nDifference modulus greater than errorn");
           break;
         }
         //printf("nyi = %lfn", yi);
         yi=y;
    
         //printf("nxi = %lfn", xi);
         xi=xi h; 
         n  ; //Here the problem item 5     
    
         if (n>10000.0){
           printf("nIt was not possible to achieve the specified accuracyn");
           break;
         }
         if (y==0.0){
           printf("nERROR Feasible region!nPlease enter a new spacingn");
           break;
         }
     } 
    
     printf("___________________________________n");
     printf("The y value is %lfn", round_y(y, count));
     printf("Eps is %lfn",eps);
     printf("The number of iterations is %dn",iter_count);
     

    }

Ответ №1:

для item5 вас нужна функция firstdecplace()

для item8 вас нужны две петли

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

//round y
double round_y(double y, int count) {
        return round(y * pow(10, count)) / pow(10, count);
    }
//function
const double f(double x, double y){
    return 2.0*x*sqrt(y)-y;  
}

unsigned int firstdecplace( double error ) //item 5
{
  if( error <= 0 )
  {
    printf( "Error at firstdecplace: argument smaller equals 0n" );
    exit(1);
  }

  unsigned int  firstdec = 0; 

  while( error < 1 )
  {
    firstdec  ;
    error *= 10;
  }

  return firstdec; 
}

int main(){
    int i, n;
    double y, xi, yi, h, a, b, s, eps;
    printf("Enter value a = ");
    scanf("%lf",amp;a);
    xi=a;

    printf("Enter value b = ");
    scanf("%lf",amp;b);

    printf("Enter value s = ");
    scanf("%lf",amp;s);
    yi=s;

    printf("Enter value eps = ");
    scanf("%lf",amp;eps); 

   
    int count = 1;

//Euler's method  
  int epsflag = 0;
  double approx; // approximation of  y(b)
  int iter_count = 0;
  for( n = 1; n < 10000;   n )  // item 8 from here on
  {
    xi = a;
    for( int iteration = 0; iteration < n;   iteration )
    {       
      h=(b-a)/n;
      y=yi h*f(xi,yi);
      iter_count=iter_count 1;
  
      if( fabs(y-yi) < eps ){
        printf("nDifference modulus smaller than errorn");
        n--;
        epsflag = 1;
        break;
      }
      yi=y;
      xi=xi h; 
    }  
    if( epsflag == 1)
    {
      break;
    }
    approx = y;
    if (y <= 0.0){
      printf("nERROR Feasible region!nPlease enter a new spacingn");
      break;
    }
     
  }

  if(n == 10000){
    printf("nIt was not possible to achieve the specified accuracyn");
  }
  printf("___________________________________n");
  printf("The y value is %lfn", round_y(approx, firstdecplace(eps)));
  printf("Eps is %lfn",eps);
  printf( "number of iteration for the approxmation of y(b): %dn", n );
  printf("The number of total iterations: %dn",iter_count);
}