#include <stdio.h>
#include <math.h>
double epsilon = 1;
double a = 0.5;
int limit = -20;
double max(double a,double b)
{
if(a>b) return a;
else return b;
}
double f(double x)
{
return (1-a)/(1-exp(-1/epsilon))*(1-exp(-x/epsilon))+a*x;
}
int main()
{
int n = 100;
double h = 1.0/n; //若写成h = 1/n 则输出h = 0,因为整型除整型还是整型
double y[n+1];
for (int i = 0; i < n+1; i++)
{
if (i == 0)
{
y[i] = 0;
}
else if (i == n)
{
y[i] = 1;
}
else
{
y[i] = 0.5;
}
}
double value = 1;
double delta_f;
while (value > pow(10, limit))
{
for (int i = 1; i< n; i++)
{
double origin = y[i];
y[i] = -1/(2*epsilon + h) * (a*h*h - epsilon*y[i-1] -(epsilon+h)*y[i+1]);
double delta_i = fabs(y[i] - origin);
if (i >1)
{
value = max(delta_i, delta_f);
}
delta_f = delta_i;
}
}
for (int i = 0; i < n+1; i++)
{
printf("迭代值:y%-3d = %lf\t 精确值:y%-3d = %lf\t 两者之差(绝对值):%lf \n", i, y[i], i, f(i*h), fabs(y[i]-f(i*h)));
}
return 0;
}