gnuplot: сумма [‹var› = ‹начало›:‹конец›] ‹выражение› стратегия

В следующем сценарии я хотел бы построить y(x):

введите здесь описание изображения

и эта функция u(x):

введите здесь описание изображения

ИЗМЕНИТЬ

Построить график y(x) легко, но у меня возникли проблемы с графиком функции u(x).

u(x) — это та же функция, что и y(x), но суммирующая каждый шаг.

Поэтому, чтобы построить u(x), я попробовал стратегию sum [<var> = <start>:<end>] <expression>. Я реализовал эту нотацию как:

replot sum[x=1:6] y(x) with line lt -1 lw 1 lc 2 title "u(x)"

в следующем скрипте:

 #

 set ylabel "y" font  ", 20"
 set xlabel 'x' font  ", 20"


 set format y "%9.4f"
 set xrange [1:6]

 set yrange [0:20]
 set xtics font ", 15"
 set ytics font ", 15"


 set key font ",17" # Changes the font of the letters of the legend

 y(x) = (2*x)/(x**2)
 plot y(x) with line lt -1 lw 1 lc 1 title "y(x)"
 replot sum[x=1:6] y(x) with line lt -1 lw 1 lc 2 title "u(x)"


 pause -1
 set term post enh color eps
 set output "y_x.eps"
 replot

Я не уверен, действительно ли стратегия sum[x=1:6] y(x) замышляет u(x).

Чтобы проверить это, мы можем сделать следующее:

мы знаем это:

введите здесь описание изображения

Итак, какое значение в gnuplot для u(6)? Если вы запустите этот скрипт, вы получите:

введите здесь описание изображения

масштабирование:

Я вижу, что u(6) достигает значения 2.0000, а не 3.5835.

Это заставляет меня думать, что replot sum[x=1:6] u(x) не отображает u(x_i) (вторая формула)

Как я мог построить u(x) ?.

введите здесь описание изображения

ИЗМЕНИТЬ 2

Запуск replot sum[i=1:6] y(i) в этом скрипте:

set ylabel "y" font  ", 20"
set xlabel 'x' font  ", 20"


 set format y "%9.4f"

 set xrange [1:6]

 set yrange [0:20]
 set xtics font ", 15"
 set ytics font ", 15"


 set key font ",17" # Changes the font of the letters of the legend

 y(x) = (2*x)/(x**2)
 plot y(x) with line lt -1 lw 1 lc 1 title "y(x)"


 replot sum[i=1:6] y(i) with line lt -1 lw 1 lc 2 title "u(x)"

 pause -1
 set term post enh color eps
 set output "y_x.eps"
 replot

выдает следующее: u(6) = 3.000:

введите здесь описание изображения

введите здесь описание изображения

ИЗМЕНИТЬ 3

Используя y(x) = (2.*x)/(x**2) или y(x) = (2.*x)/(x**2.), я получаю u(6) = 4.9:

введите здесь описание изображения

введите здесь описание изображения

ИЗМЕНИТЬ 4

Изготовление:

N=100
replot sum[i=0:N-1] y(1. + (i+0.5)*5./N)*5./N with line lt -1 lw 1 lc 5 title "sum(x)"

выдает константу (голубая линия) y=3.58. Это результат численной аппроксимации суммирования.

введите здесь описание изображения

Чего я действительно хочу добиться, так это построить функцию u(x) для всех значений x_{i}..., в которой на каждом шаге i выполняется суммирование по всем предыдущим шагам и генерируется новое значение u. Я хотел бы построить функцию u(x)...


person DavidC.    schedule 14.09.2016    source источник


Ответы (1)


На самом деле то, что на самом деле отображается как u(x), это всего лишь 6*y(x), вы можете проверить это, если замените в своем скрипте строку

plot y(x) with line lt -1 lw 1 lc 1 title "y(x)"

с

plot 6*y(x) with line lt -1 lw 1 lc 1 title "y(x)"

что линия тогда совпадет с u(x).

Также обратите внимание, что функция y(x) не является интегрируемой на интервале [0, 6], поскольку она ведет себя на 0 как 1/x (в вашей формуле вы получите выражение ln(0)).

person ewcz    schedule 14.09.2016
comment
Большое спасибо за ответ. Я согласен, что то, что на самом деле изображено как u(x), на самом деле всего лишь 6*y(x). Я почему-то не понимаю, это действительно происходит. Я также согласен с пределами интегрирования. См. отредактированную версию: До сих пор неизвестно, как на самом деле могло быть построено u(x). Спасибо - person DavidC.; 15.09.2016
comment
Должен признаться, что определение u(x) мне не очень понятно. Предполагается ли, что это постоянное приближение интеграла, рассчитанного по правилу прямоугольника? Если это так, вы можете использовать sum[i=1:5] y(i) - исходная проблема возникает из-за того, что переменная суммирования x конфликтует со стандартной независимой переменной, используемой для построения графика... Однако аппроксимация будет довольно плохой, потребуется правило более высокого порядка или больше точек... - person ewcz; 15.09.2016
comment
Большое спасибо за ответ. Это всего лишь пример того, чего я пытаюсь добиться: иметь возможность построить формулу, в которой есть суммирование. Настоящая формула, которую я хочу построить, немного сложна. Чтобы упростить вопрос, я просто взял пример, который является первой формулой, y(x), которую можно легко построить (красная линия). Затем я представил другую функцию u(x), которая является просто y(x), но с одним суммированием внутри. Я пытаюсь построить эту функцию u(x). - person DavidC.; 15.09.2016
comment
Этот простой случай также хорош, потому что я могу проверить, в порядке ли график, сравнив результат этого интеграла. Я знаю, что то приближение весьма бедно. Если график u(x) правильный, то u(6) достигнет значения, аналогичного 3.58 (результат точного интеграла). Я применил любезно предложенную вами стратегию replot sum[i=1:6] y(i) with line lt -1 lw 1 lc 2 title "u(x)" и получил значение u(6) = 3.000 (см. EDIT 2). - person DavidC.; 15.09.2016
comment
Следовательно, эта зеленая линия u(x) не является точным описанием функции u(x). Есть ли способ увеличить i-шаг? Что-то вроде sum[i=1:step:6] не работает. Большое спасибо - person DavidC.; 15.09.2016
comment
вы получаете u(6) = 3.000, потому что y(x) = (2*x)/(x**2) в сочетании с sum[i=1:6] y(i) выполняется в целочисленной арифметике - используйте y(x) = (2.*x)/(x**2) - person ewcz; 15.09.2016
comment
Большое спасибо за ответ. Я использовал y(x) = (2.*x)/(x**2) и y(x) = (2.*x)/(x**2.) и получил u(6) = 4.9 (см. EDIT 3) вместо чего-то похожего на 3.58 - person DavidC.; 15.09.2016
comment
Вы видите, что я имею в виду? Последний комментарий показывает, что дело не в целочисленной арифметической комбинации... - person DavidC.; 15.09.2016
comment
нет, не только, это также то, как вы вычисляете приближение к интегралу - с помощью правила прямоугольника на интервале [1,6] и N точек интегрирования правильное предписание - sum[i=0:N-1] y(1. + i*5./N)*5./N, вы можете проверить, что print sum[i=0:99] f(1. + i*5./100)*5./100 дает ~3.62559. Однако даже правило средней точки sum[i=0:N-1] y(1. + (i+0.5)*5./N)*5./N работает здесь намного лучше - с N=100 оно дает ~3.5833... - person ewcz; 16.09.2016
comment
Большое спасибо за подробное объяснение того, как правильно численно аппроксимировать интеграл. Я высоко оценил это. replot sum[i=0:N-1] y(1. + (i+0.5)*5./N)*5./N дает, очевидно, строку, которая является результатом окончательного суммирования, 3.5833. См. РЕДАКТИРОВАТЬ 4 . Однако я хотел бы получить график u(x) для каждого значения x_{i}, в котором на каждом шаге i выполняется суммирование по всем предыдущим шагам и новое значение из u генерируется. Большое спасибо - person DavidC.; 16.09.2016