График треугольной функции в gnuplot - PullRequest
0 голосов
/ 01 декабря 2018

Я делаю координаты треугольной функции в коде c и сохраняю их в файл .dat для построения в gnuplot.Вот мой код

#include<stdio.h>
#define N 100
double tent(double x){
if(0<=x && x<=0.5){
        return 2*x;
}
if(0.5<x && x<=1){
        return 2*(1-x);
        }
}

int main(void){
int n;
double x[102];
x[0]=0.7;
for(n=0;n<=N;n++){
x[n+1] = tent(x[n]);
printf("%lf %lf\n",x[n],x[n+1]);
printf("%lf %lf\n",x[n+1],x[n+1]);
}
return 0;
}

Когда этот код выполняется, данные координат x и данные координат y правильно установлены в файле .dat, но данные не выводятся как ожидаемый результат.

Это часть содержимого файла .dat.

0.400000 0.800000
0.800000 0.400000
0.400000 0.799999
0.799999 0.400002
0.400002 0.800003
0.800003 0.399994
0.399994 0.799988
0.799988 0.400024
0.400024 0.800049
0.800049 0.399902
0.399902 0.799805

Я не знаю почему, но в процессе он сходится к 0.Итак, gnuplot не строит треугольную функцию.Как я могу это исправить?Любые советы будут оценены.

1 Ответ

0 голосов
/ 02 декабря 2018

Есть несколько вопросов.

  1. Почему оно сходится к 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.Вот результат:

triangular function

Опять же, возможно, я не понял ваш вариант использования.

...