Search code examples
sumgnuplotundefinedfloor

Gnuplot summation issue


I am trying to make a plot of a simple mutation accumulation process on a binary tree... My technical problem in gnuplot, is that is that I want to plot the possibility of getting 2 mutations on a specific lineage on the graph, here is the equation which determines it:

P_{2 mutation} = sum[k=0:n] (m/(2**(k+1)/(1-(1/2)**k)))(1-exp(-muk))

(dont bother with the formula im not sure that this is the correct one yet :)) where n is the number of levels of the binary tree, mu is the mutation rate, and m is the number of previously randomly thrown mutations onto the graphs edges... I want to make a plot which is this possibility depending on the levels of the binary tree...

Therefore I wrote a script which is something like this:

set term pngcairo size 800,600
set title "Két mutáció megjelenésének valószínűsége, egy n szintű bináris fa egyik sejtvonalában" 
set xlabel"szintek száma (n)"
set ylabel"Két mutáció megjelenésének valószínűsége (P_{2^{lin})"
set xrange[1:10]
set yrange[0:1]

set output '2mutvalsz.png'

set multiplot
do for[i=1:10]{
mu = 0.1+(i*0.1)
m = 4
f(x)=(x/((2**(x+1))*(1-(0.5)**x)))

    if(m<floor(f(x)))
    {
        p(x)=sum [k=0:floor(x)](m*(1/((2**(x+1))*(1-(0.5)**x))))*(1-exp(-mu*k))
    }

    else
    {
        p(x)=1
    }

plot p(x)  lt i lw 1
}
unset multiplot
set output

So my problem is, that I dont know if it is correct to do what I do in the if statement... What I want is to behold the statement m< f(x) where f(x) is the number of edges in respect of n, which is an integer value therefore I use floor(f(x)), and sum through the x values (which are the number of levels what has to be an integer too... so floor(x), like a heavyside function to make the x axis discrete) in the sum...

And also I get an error message: gnuplot> load '2mutvalsz.plt' line 27: undefined variable: x

where line 27 is the end of the do for loop...

So my question is that is it a correct way to make a summation integer the x values and of course why I get the error message...

Thank you, and I hope everything is clear...


Solution

  • The error message is produced because the if statement in your script is interpreted when Gnuplot loads the script - it tries to evaluate the condition of the if statement and since the variable x is not defined, it produces the mentioned message.

    You could put everything together using the ternary operator as:

    p(x)=( m<floor(f(x)) )?( sum [k=0:floor(x)](m*(1/((2**(x+1))*(1-(0.5)**x))))*(1-exp(-mu*k)) ):1;
    

    However, since the function f(x) is on the imposed x-range of [0,1] less than 1, the condition m<floor(f(x)) will be always false.