In Wolfram Mathematica we can define an operator acting on a function (i.e. function that returns function) e.g. as for the operator of multiplication by the first argument acting on a functions of two arguments in the example below
X[f_] = Function[{x, y}, x*f[x, y]]
Then we can apply this operators to any function with any 2 arguments
In[2]:= X[g][z, t]
Out[2]= z g[z, t]
There is a similar construction in Maple
X:=proc(f) option operator; local x,y;
unapply(x*f(x,y),x,y)
end;
with the similar mode of application
> X(g)(z,t);
z g(z, t)
In Maxima I tried this
X(f):=lambda([x,y],x*f(x,y));
but when trying to apply it I get
(%i5) X(g)(z,t)
(%o5) z*f(z,t)
so, it looks like f is not recognized as an argument of function X when I used lambda.
Is there any way to solve this problem?
In case of Maple and Mathematica this type of operators helps a lot to manipulate with linear differential operators
Maxima lambda doesn't evaluate any of the expressions inside the body of it, so f is not evaluated (to g). That's the behavior you are seeing. The motivation for it that I can see is that the lambda body might contain expressions which don't have the expected effect until some variables have values, e.g. length, for ..., print, etc.
You can get the expected behavior by substituting into the body. Here are two ways to do that. The first uses the function subst which I think is maybe the most obvious.
(%i1) X(f):= subst ('f = f, lambda([x,y],x*f(x,y)));
(%o1) X(f) := subst('f = f, lambda([x, y], x f(x, y)))
(%i2) X(g);
(%o2) lambda([x, y], x g(x, y))
(%i3) X(g)(z, t);
(%o3) z g(z, t)
The second uses the function buildq which is effectively a substitution function which quotes (does not evaluate) the expression into which something is substituted.
(%i4) X(f) := buildq ([f], lambda ([x, y], x*f(x, y)));
(%o4) X(f) := buildq([f], lambda([x, y], x f(x, y)))
(%i5) X(g);
(%o5) lambda([x, y], x g(x, y))
(%i6) X(g)(z, t);
(%o6) z g(z, t)
Finally, if you are interested in creating lambda expressions using evaluated expressions more often, you could create your own kind of lambda for that. I'll call it evlambda here.
(%i11) evlambda (a, b) := apply (lambda, [a, b]);
(%o11) evlambda(a, b) := apply(lambda, [a, b])
(%i12) X(f) := evlambda ([x, y], x*f(x, y));
(%o12) X(f) := evlambda([x, y], x f(x, y))
(%i13) X(g);
(%o13) lambda([x, y], x g(x, y))
(%i14) X(g)(z, t);
(%o14) z g(z, t)
The key here is that evlambda is defined as an ordinary function, so its arguments are evaluated. So by the time lambda is applied, b has been evaluated so it contains g.
Note that this evlambda won't do anything useful with length, for ..., and print, which is to be expected.
(%i15) foo : evlambda ([l], 1 + length(l));
length: argument cannot be a symbol; found l
-- an error. To debug this try: debugmode(true);
(%i16) bar : evlambda ([n], for i thru n do print (i));
Unable to evaluate predicate 1 > n
-- an error. To debug this try: debugmode(true);
(%i17) baz : evlambda ([x], print (x));
x
(%o17) lambda([x], x)
(%i18) baz(5);
(%o18) 5
The last one, with print, evaluates print when baz is defined (so x is the output), but then not again when baz(5) is evaluated -- this behavior is to be expected since evlambda evaluates its arguments.
Related
I cannot find anything about this, sorry.
If I have expressions with the symbolic function f(x) and now I want to replace in these expression f(x) by its explicit form how to do it?
For example:
I have
f(x):= x^2+sin(x)
and in the differentiation
diff (%e**sqrt(f(x)*a), x,2);
I want to replace now f(x) by the expression above?
Thanks
Karl
(%i1) i: integrate(f(x)*f(4*x), x, 0, 1) $
(%i2) f(x):= x^2+sin(x) $
(%i3) ev(i, f);
1
/
[ 2 2
(%o3) I (sin(x) + x ) (sin(4 x) + 16 x ) dx
]
/
0
-- Function: ev (<expr>, <arg_1>, ..., <arg_n>)
Evaluates the expression <expr> in the environment specified by the
arguments <arg_1>, ..., <arg_n>. The arguments are switches
(Boolean flags), assignments, equations, and functions. 'ev'
returns the result (another expression) of the evaluation.
Consider the following statements:
(%i1) matchdeclare([a,b], constantp);
(%o1) done
(%i2) defmatch(match, a*x+b);
(%o2) match
(%i3) match(2*x+3);
(%o3) [b = 3, a = 2]
I want to generalise this pattern in a function. But then it doesn't seem to work anymore:
(%i1) matchForm(test, form, constants) := block(
matchdeclare(constants, constantp),
defmatch(match, form),
match(test)
);
(%o1) matchForm(test, form, constants) :=
block(matchdeclare(constants, constantp), defmatch(match, form), match(test))
(%i2) test: 2*x+3;
(%o2) 2 x + 3
(%i3) form: a*x+b;
(%o3) a x + b
(%i4) constants: [a,b];
(%o4) [a, b]
(%i5) matchForm(test, form, constants);
defmatch: evaluation of atomic pattern yields: a x + b
(%o5) false
Debugging a bit, a bit it seems like the issue is that matchdeclare doesn't accept the argument to be a variable. Is ther any way to make a function like I try to make in maxima?
I haven't tried this, but: perhaps you can get the effect you want via
apply (matchdeclare, [constants, 'constantp]),
which will evaluate constants before calling matchdeclare.
In mathematics you can write f(f(f(x))) as f^3(x). I've trawled through the Maxima manuals but can't find a way to express this for an arbitrary power.
Maxima doesn't have a built-in operator for that. But I think you can define a workable solution yourself. Maybe this works for you:
(%i1) infix ("o^") $
(%i2) matchdeclare (ff, symbolp, xx, all) $
(%i3) tellsimp ((ff o^ 0)(xx), xx) $
(%i4) tellsimp ((ff o^ 1)(xx), ff(xx)) $
(%i5) matchdeclare (nn, lambda ([e], integerp(e) and e > 1)) $
(%i6) tellsimp ((ff o^ nn)(xx), (ff o^ (nn - 1))(ff (xx))) $
I've defined simplification rules for "o^" since I want it to be applied only if it appears in a function call expression (i.e., something like (f o^ 3)(x), not just f o^ 3 by itself), and the second argument is a literal, nonnegative integer.
You have to write a space between "o^" and the following token, since otherwise the parser gets confused.
Here are some examples:
(%i7) (h o^ 0)(u);
(%o7) u
(%i8) (h o^ 1)(u);
(%o8) h(u)
(%i9) (h o^ 2)(u);
(%o9) h(h(u))
(%i10) (h o^ 3)(u);
(%o10) h(h(h(u)))
(%i11) (h o^ n)(u);
(%o11) h o^ n(u)
(%i12) %, n=2;
(%o12) h(h(u))
(%i13) h o^ 3;
(%o13) h o^ 3
(%i14) %(z);
(%o14) h(h(h(z)))
(%i15) (h o^ -1)(u);
(%o15) h o^ (- 1)(u)
Note that in cases which don't match the rules, the expression is not simplified. This leaves the door open to defining additional rules to handle those cases, without changing the stuff that already works.
The display of unsimplified expressions (e.g. %o11) is ambiguous; this is a bug.
I have probably a very simple question.
What returns in Maxima function chebyshev_t(n, t)? I mean the exact mathematical formula.
Best Regards
When n is a literal integer (e.g. 2, 3, 5, etc) then chebyshev_t evaluates to a polynomial.
When n is a symbol declared an integer (via declare(n, integer) then chebyshev_t evaluates to a summation.
(%i1) display2d : false $
(%i2) chebyshev_t (5, u);
(%o2) -25*(1-u)-16*(1-u)^5+80*(1-u)^4-140*(1-u)^3+100*(1-u)^2+1
(%i3) declare (m, integer);
(%o3) done
(%i4) chebyshev_t (m, u);
(%o4) 'sum(pochhammer(-m,i1)*pochhammer(m,i1)*(1-u)^i1
/(pochhammer(1/2,i1)*2^i1*i1!),i1,0,m)
With Maxima, it is possible to replace an unknown by a value using at() statement.
But this use a list, for the substitution, and the solve() statement don't return a list.
Code:
(%i1) g(x):=x^2+a;
2
(%o1) g(x) := x + a
(%i2) g(x),solve(x=3),a=2;
(%o2) 11
I managed to compute a result using commas, but I can't create a function to do so:
(%i3) f(y) := g(x),solve(x=3),a=y;
(%o3) f(y) := g(x)
(%i4) f(2);
2
(%o4) x + a
Is there a statement for which the commas acts like it acts directly in the line?
Edit:
Actually, it is possible to use at() with solve() to create the function f(), as solve() just return a list of lists. So the code would be:
(%i5) f(y) := at(at(g(x), solve(x=3)[1]), a=y);
(%o5) f(y) := at(at(g(x), solve(x = 3) ), a = y)
(%i6) f(2);
(%o6) 11
Notice the [1] after solve(x=3) in the (%i5). It select the the first item (solution) of list.
I'm not sure what you are trying to accomplish -- probably it would be best if you would back up a couple of steps and describe the larger problem you are trying to solve here.
My best guess as to what you want is that you are trying to use the result of 'solve' to find a value to substitute into some expression. If so you can achieve it like this: f(eq, u) := map (lambda ([e], subst (e, g(u))), solve (eq, x)); where eq is an equation to solve for x and then substitute into g(u). Note that 'solve' can return multiple solutions so that's why I use 'map' to apply something to each solution. Here is an example output:
(%i7) f(eq) := map (lambda ([e], subst (e, g(x))), solve (eq, x));
(%o7) f(eq) := map(lambda([e], subst(e, g(x))), solve(eq, x))
(%i8) solve (x^2 + 2*x + 2);
(%o8) [x = - %i - 1, x = %i - 1]
(%i9) f (x^2 + 2*x + 2);
(%o9) [g(- %i - 1), g(%i - 1)]
Of course you can define 'g' in whatever way is appropriate.
The answer to your specific question (which I believe is not actually very much relevant, but anyway) is to use 'block' to group together expressions to be evaluated. E.g. f(x) := block (...);
Perhaps I'm answering the wrong question. Maybe what you want is ev(foo, bar, baz) -- ev is the function that is actually called when you write foo, bar, baz at the console input prompt. So the function would be written f(y) := ev (g(x), solve(x=3), a=y).
However, bear in mind that there are several different kinds of functionality built into ev, so it is hard to understand (see the documentation for ev). Instead, consider using subst which is much simpler.