Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2000
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: MultiLinear and Linear function

  • To: mathgroup at smc.vnet.net
  • Subject: [mg25573] Re: [mg25540] MultiLinear and Linear function
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sun, 8 Oct 2000 00:41:59 -0400 (EDT)
  • References: <200010070735.DAA01824@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Arturas Acus wrote:
> 
> Dear group,
> 
> Here was a question how to make a function linear. Below is the
> solution
> from (I think Noncommutative Algebra package, but not sure):
> 
> SetLinear[a__] := (Function[x, x[0] := 0;
>           x[y_ + z_] := x[y] + x[z];
>           x[c_ y_] := c x[y] /; NumberQ[c];
>           x[y_/c_] := (1/c) x[y] /; NumberQ[c];
>           x[c_] := c x[1] /; NumberQ[c] && Not[TrueQ[c == 1]];
>           x[-y_] := -x[y];
>           LinearQ[x] = True;] /@ {a});
> 
> It works fine, but is only applied to function of multiple variables.
> Bolow is my solution for MultiLinear function. It works, but is not
> so
> elegant as example bekow. Probably anybody knows a better approach?
> 
> makePattern[x_, y_, {n_Integer, {m_Integer}}] :=
>   Module[{z, p1, p2}, p1 = Table[Unique[], {n - 1}];
>     p2 = Table[Unique[], {z, n + 1, m}];
>     ReplaceAll[
>       Function[y,
>         x[Sequence @@ Flatten[Pattern[#, Blank[]] & /@ p1], y,
>           Sequence @@ Flatten[Pattern[#, Blank[]] & /@ p2]]],
>       Pattern -> myPattern]]
> 
> SetMultiLinear[
>     s__Symbol, {i_Integer, {l_Integer}}] := (Function[x,
>           Module[{pureF, locvar},
>               pureF = makePattern[x, locvar, {i, {l}}];
>               SetDelayed @@ {ReplaceAll[
>                     Evaluate[pureF[y_ + z_], myPattern -> Pattern]],
>                   ReplaceAll[Evaluate[pureF[y] + pureF[z]],
>                     myPattern[a_, Blank[]] :> a]};
> 
>               SetDelayed @@ {ReplaceAll[
>                     Evaluate[pureF[c_*y_], myPattern -> Pattern]],
>                   ReplaceAll[Evaluate[c*pureF[y]],
>                       myPattern[a_, Blank[]] :> a] /; NumberQ[c]};
> 
>               SetDelayed @@ {ReplaceAll[
>                     Evaluate[pureF[y_/c_], myPattern -> Pattern]],
>                   ReplaceAll[Evaluate[(1/c)*pureF[y]],
>                       myPattern[a_, Blank[]] :> a] /; NumberQ[c]};
> 
>               SetDelayed @@ {ReplaceAll[
>                     Evaluate[pureF[c_], myPattern -> Pattern]],
>                   ReplaceAll[Evaluate[c*pureF[1]],
>                       myPattern[a_, Blank[]] :> a] /;
>                     NumberQ[c] && Not[TrueQ[c === 1]]};
>               LinearQ[x, {i, {l}}] = True;
>               ];
>           ] /@ {s}) /; Greater[l, 1]
> 
> 
> SetMultiLinear[s__Symbol, {All, {l_Integer}}] :=
>   Map[SetMultiLinear[s, {#, {l}}] &, Range[l]]
> 
> 
> Example of usage: Make   Commutator and AntiCommutator linear
> functions of both variables:
> SetMultiLinear[Commutator,AntiCommutator,{All,{2}}].
> 
> Make f be linear in 3-th its argument of total 5:
> SetMultiLinear[f,{3,{5}}].
> 
> 
> Better solution welcome
> 
> 
> Dr. Arturas Acus
> Institute of Theoretical
> Physics and Astronomy
> Gostauto 12, 2600,Vilnius
> Lithuania
> 
> E-mail: acus at itpa.lt
>    Fax: 370-2-225361
>    Tel: 370-2-612906

Could emulate SetLinear. Below is simple code to do this (SetLinear is
overly complicated re handling of numeric scalars).

SetMultilinear[heds_] := (
	Function[x, x[___,0,___] := 0;
	x[a___, y_ + z_, b___] := x[a,y,b] + x[a,z,b];
	x[a___,c_?NumericQ*y_,b___] := c*x[a,y,b];
	x[a___,c_?NumericQ,b___] := c*x[a,1,b] /; c =!= 1;
	MiltilinearQ[x] = True;] /@ {heds});

Example:

In[14]:= SetMultilinear[y];

In[15]:= ??y
Global`y

y[___, 0, ___] := 0
 
y[a$___, y$_ + z$_, b$___] := y[a$, y$, b$] + y[a$, z$, b$]
 
y[a$___, y$_*(c$_)?NumericQ, b$___] := c$*y[a$, y$, b$]
 
y[a$___, (c$_)?NumericQ, b$___] := c$*y[a$, 1, b$] /; c$ =!= 1


Example:

In[16]:= y[3, 2+4*Pi*a, x+7*z]
Out[16]= 6 y[1, 1, x] + 42 y[1, 1, z] + 12 Pi y[1, a, x] + 84 Pi y[1, a,
z]


Daniel Lichtblau
Wolfram Research


  • Prev by Date: Re: Complex Function Plot
  • Next by Date: 3-D HDF Importing and displaying
  • Previous by thread: MultiLinear and Linear function
  • Next by thread: mathematica in batch mode?