I would like to ask how can I set arbitrary base of logarithm in gnuplot (I would need f(x)=x^{1+9log2(x)} function to plot).
It seems like there are only builtin functions for the natural log and log10. But you can easily change the base of the logarithm.
log_b(x) = log_k(x) / log_k(b)
Thus, you can rewrite your formula as
f(x) = x**(1 + 9 * log(x)/log(2))
To expand upon the answer of tobias_k, you can create a user-defined function which takes the base as a secondary argument:
logb(x, base) = log(x)/log(base)
And then rewrite your formulas as:
f(x) = x**(1 + 9 * logb(x, 2))
Related
I want to plot the following function in gnuplot:
f(x) = \sum_{i=1}^{x-1} 10^i
I tried using f(x)= (sum [i=1:x-1] 10 ** i), but it says "range specifiers of sum must have integer values".
Any idea how can I plot this sum function where the independent variable is in the limits? Thanks!
Make an integer out of your independent variable. Check help int. Maybe needs some changes depending on what exactly you want to have. Try:
f(x) = (sum [i=1:int(x-1)] 10**i)
I got a equation in the following form
f(t) = 2*cos(t) + 3*sin(t)
and I want to reduce it to something like
f(t) = (9 + 4)^(1/2) * cos(t - atan(3/2))
None of the trigonometric simplify functions seems to work. Is there a way to do so?
100e^0.25*y = 97.5
Solving for y
Using Excel Solver
I tried using empty column entry for y in 'By changing cells' and Set objective function as LHS of above equation (empty column entry in equation included) equal to value of 97.5 in solver.
It gives no solution
How do I do this?
It's a bit ambiguous what you're asking...
Literal math interpretation: 100*(e^0.25)*y = 97.5
Then y = 97.5 / ( 100 * exp(.25)) = .759
My guess of what you want: 100*e^(0.25*y) = 97.5
Then y = ln(97.5/100) / .25 = -.101
Another possibility: (100 * e)^(0.25 * y) = 97.5
Then y = (ln(97.5) / ln(100*e)) / .25 = 3.268
Whatever it is, this doesn't need solver!
You don't really need the solver. Just re-arrange your formula to solve for Y. Since y = b^x is the same as log(b)Y = x (log of Y, with base b)
Your formula above is the same as:
Y = (log(100e)97.5))/.25
(Read aloud, that's log of 97.5, with base 100e, divided by .25
So, Y = 3.268305672
(Bonus points for someone who can tell me how to format this so the Log looks correct)
The question is "How do I solve this exponential equation on Excel Solver?" which is a fair enough question, as it points to trying to understand how to set up solver.
My interpretation of the equation provided is given in this screenshot ...
The solver dialog box is then setup as follows ...
Of note:
This is a non-linear equation and needs GRG Nonlinear. If you choose LP Simplex, it will not pass the linearity test.
Ensure "Make Unconstrained Variables Non-Negative" is not checked.
It provided this result for me ...
A more precise answer can be obtained by decreasing the "Convergence" value on the GRG Non-Linear Options dialog.
A problem this simple can also be solved using Goal Seek.
So I'm trying to plot three parametric functions using the gnuplot;
unfortunately, I cannot get around some garbage that is generated in the output plot. I tried to isolate the problem by splitting a function j into j1 and j2, just changing the position of the minus sign. Unexpectedly, the functions j1 and j2 jump strangely when close to the origin. I currently use version 4.6 of gnuplot, any suggestions?
CODE BELOW:
set parametric
j1(x) = -((1.0/27.0*(1.+9.*x))/2.0)**(1./3.) #negative portion
j2(x) = (-(1.0/27.0*(1.+9.*x))/2.0)**(1./3.)
k(x) = ((-x/3.0)**(3./2.))**(1./3.)
l(x) = -((-x/3.0)**(3./2.))**(1.0/3.0)
tt(x) = sqrt(-x/3.)
set trange [-1.0/3.0:0]
set yrange [0:1.0/3.0]
set xrange [-1./6.:1./3]
plot j1(t),tt(t) w l ls 1, j2(t),tt(t) w l ls 1, k(t),tt(t) w l ls 2, l(t),tt(t) w l ls 3
The problem comes from selecting the cube root of a negative number. Gnuplot can work with complex numbers, and in the complex number system there are three cube roots of any number†. For a real number, one of these is real and two are complex. Gnuplot is selecting the first‡ one which is complex for a negative number (for a positive number, the first one is real).
print (-8)**(1/3.0) # prints {1.0, 1.73205080756888}
The solution is to construct our own cube root function
cuberoot(x) = sgn(x)*abs(x)**(1/3.0)
This will select take the cube root of the absolute value (always positive) and make the result have the same sign as the original.
We can then use it in our functions
j1(x) = -cuberoot((1.0/27.0*(1.+9.*x))/2.0) #negative portion
j2(x) = cuberoot(-(1.0/27.0*(1.+9.*x))/2.0)
leaving the rest of the code alone.
Without custom cuberoot function
With custom cuberoot function
† For the given example of -8, they are 1 + 1.7320508i, -2, and 1 - 1.7320508i.
‡ When ordered in increasing order by complex argument (restricted to the interval [0,2π) ).
What is the proper way in gnuplot to fit a function f(x) having the next form?
f(x) = A*exp(x - B*f(x))
I tried to fit it as any other function using:
fit f(x) "data.txt" via A,B
and the output is just a sentence saying: "stack overflow"
I don't even know how to look for this topic so any help would be much appreciate it.
How are this kind of functions called? Nested? Recursive? Implicit?
Thanks
This doen't only fail for fitting, also for plotting. You'll have to write down the explicit form of f(x), otherwise gnuplot will loop it until it reaches its recursion limit. One way to do it would be to use a different name:
f(x) = sin(x) # for example
g(x) = A*exp(x - B*f(x))
And now use g(x) to fit, rather than f(x). If you have never declared f(x), then gnuplot doesn't have an expression to work with. In any case, if you want to recursively define a function, you'll at least need to set a recursion limit. Maybe something like this:
f0(x) = x
f1(x) = A*exp(x - B*f0(x))
f2(x) = A*exp(x - B*f1(x))
f3(x) = A*exp(x - B*f2(x))
...
This can be automatically looped:
limit=10
f0(x) = x
do for [i=1:limit] {
j=i-1
eval "f".i."(x) = A*exp(x - B*f".j."(x))"
}
Using the expression above you set the recursion limit with the limit variable. In any case it shall remain a finite number.
That is a recursive function. You need a condition for the recursion to stop, like a maximum number of iterations:
maxiter = 10
f(x, n) = (n > maxiter ? 0 : A*exp(x - B*f(x, n+1)))
fit f(x, 0) "data.txt" via A,B
Of course you must check, which value should be returned when the recursion is stopped (here I used 0)
Thanks for your replies
Discussing with a friend about this problem I found a way around.
First, this kind of functions are call "transcendental functions", that means that the function f(x) is not explicitly solvable, but the variable x could be solved as a function of f(x) and it will have the next form
x = B*f(x) + log(f(x)/A)
Therefore it is possible to define a new function (that is not transcendental)
g(x) = B*x + log(x/A)
From here you can fit the function g(x) to the plot x vs y. Using gnuplot it is possible to do the fitting as
fit g(x) "data.txt" using ($2):($1) via A,B
Hope this will help someone else