Есть несколько вопросов.
- Почему оно сходится к 0?
Одной из причин является использование вычислений с плавающей запятой. Здесь вы можете найти более подробную информацию.Другая причина, которая объясняет предел 0 вместо бесконечности или что-то еще, - это поведение фиксированной точки вашего уравнения.(Я думаю, вторая причина довольно интересная, но она выходит за рамки этого вопроса, и выяснение того, как она работает, не поможет нам в построении треугольной функции.)
Возвращаемое значение функции
tent
.
Ваша функция tent
не имеет return
, если x <0 или x> 1. Ваш компилятор должен предупредить вас отот.(Я компилирую с gcc -Wall
.) Вы должны добавить return 0;
.
Использование вашей функции.
Я понимаю вашу функцию double tent(double x)
следующим образом: она принимает параметр x
и вычисляет соответствующее значение y
.Но когда вы вызываете функцию, вы всегда берете значение y
в качестве ввода для вычисления другого значения y
.Это действительно то, что вы хотите?
Я думаю, вы можете захотеть иметь массив значений x
и затем вычислить массив соответствующих значений y
.
Почему у вас есть два
print
заявления?
Возможно, я не понимаю ваш вариант использования.
Зачем вам нужен массив?
Вы вычисляете значение и распечатываете его.Нет необходимости в массиве, или я ошибаюсь?
Используйте
N
везде.
Не используйте N
в некоторых точках и жестко 102
в других точках.И избегайте как 100, так и 102.
До сих пор мы получаем следующий код C:
#include<stdio.h>
#define N 11 // instead of 101 just for debugging
double tent(double x){
if(0<=x && x<=0.5){
return 2*x;
}
if(0.5<x && x<=1){
return 2*(1-x)
}
return 0;
}
int main(void){
double x;
double y;
double x0 = 0.0;
double x1 = 1.0;
for(int n=0; n < N; n++) {
x = x0 + n*(x1-x0)/(N-1);
y = tent(x);
printf("%lf %lf\n", x, y);
}
return 0;
}
Это вывод:
0.000000 0.000000
0.100000 0.200000
0.200000 0.400000
0.300000 0.600000
0.400000 0.800000
0.500000 1.000000
0.600000 0.800000
0.700000 0.600000
0.800000 0.400000
0.900000 0.200000
1.000000 0.000000
Выможет построить это с помощью plot "a.dat" with lines
.
Вам вообще нужен код c?
Вы можете построить треугольную функцию непосредственно в gnuplot:
set xrange [-1:2]
set samples 1000
plot (abs(x-0.5) < 0.5) ? (1 - 2*abs(x-0.5)) : 0
Определение функции взято из Википедия и адаптирован к вашей функции tent
.Вот результат:
Опять же, возможно, я не понял ваш вариант использования.