#c #math #task
Вопрос:
Пожалуйста, помогите с пунктами 5 и 8 (проблема описана в комментарии в коде). Здесь задача:
Использование метода Эйлера для построения приближенного решения задачи Коши с заданной точностью.
Напишите программу, которая вычисляет приблизительное значение решения задачи Коши.
- Начальное условие (a и s (y(a)=s)) должно быть введено с клавиатуры.
- Точка, в которой рассчитывается приблизительное значение (b), должна быть введена с клавиатуры.
- Если внутри или на границах интервала [a, b] функция имеет точки останова (точки, которые не входят в Допустимую область), на экране должно отображаться сообщение с предложением ввести новый интервал. Допустимый регион может быть рассчитан вручную для вашего конкретного варианта.
- Допустимая погрешность расчета должна быть введена с клавиатуры.
- Первое приближение должно быть рассчитано для n = 1. Затем при вычислении каждого следующего итерационного значения количество сегментов следует увеличивать, деля интервал на 1.
- Итерационный процесс стоит остановить, если модуль разности между двумя последними приближениями меньше указанной погрешности.
- Если n превышает 10000, а требуемая точность не достигнута, отобразите текущий ответ и текущую ошибку с пометкой «Не удалось достичь указанной точности».
- На экране должно отображаться последнее итоговое значение (окончательный ответ), округленное в соответствии с ошибкой, а также требуемое количество итераций.
#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);
}