MathGroup Archive 1995

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

Search the Archive

Re: Piecewise function generator

  • To: mathgroup at christensen.cybernetics.net
  • Subject: [mg1189] Re: Piecewise function generator
  • From: Count Dracula <lk3a at kelvin.seas.virginia.edu>
  • Date: Mon, 22 May 1995 01:52:46 -0400
  • Organization: University of Virginia

In Message-ID: <3p8shv$6b8 at news0.cybernetics.net>  Daryl Reece writes:

>  I want to generate a piecewise continuous linear function by giving a 
>  function, call it F, a list of {x,y} values defining the corners of the 
>  function, e.g., pts={{20,0.08},{50,0.8},{250,0.8},{5000,0.004}}
   
If no symbolic expression for the function is needed 

Interpolation[pts, InterpolationOrder -> 1] 

is the briefest way. If symbolic expressions are needed, 
Roman Maeder's program MakeFunctions.m in the Packages 
directory shows a way to generate the rules needed. 
For instance, the program below can be used.
__________________________________________________________________________________
LinearFunction::usage = "LinearFunction[f, {{x0, a}, {x1, b}}] defines rules for f
	such that f[x] = a for x = x0, f[x] = b for x = x1 and
	f is linear between x0 and x1. LinearFunction[f, pointslist] defines
        rules for a piecewise linear function passing through the (x, y)
        coordinates in the list pointslist."

MakeRuleConditional::usage = "MakeRuleConditional[f, x, rhs, cond]
	globally defines the rule f[x_] := rhs /; cond."

Off[ RuleDelayed::rhs ]

SetAttributes[MakeRuleConditional, HoldAll]

MakeRuleConditional[f_Symbol, var_Symbol, rhs_, condition_] :=
	(f[var_] := rhs /; condition)

LinearFunction[f_Symbol, {{x0_, a_}, {x1_, b_}}] :=
	With[{slope = (b-a)/(x1-x0)},
		MakeRuleConditional[f, x, a + (x-x0) slope, x0 <= x <= x1];
            ]

LinearFunction[f_Symbol, pointslist_List] :=
       (Map[ LinearFunction[f, #1] &, Partition[ Union[pointslist], 2, 1]]; Null)

__________________________________________________________________________________

Example:

In[2]:= pts = {{20,0.08},{50,0.8},{250,0.8},{5000,0.004}};

In[3]:= LinearFunction[f, pts]

In[4]:= ?f
Global`f

f[x_] := 0.08 + (x - 20)*0.024 /; 20 <= x <= 50
 
f[x_] := 0.8 + (x - 50)*0. /; 50 <= x <= 250
 
f[x_] := 0.8 + (x - 250)*-0.0001675789473684211 /; 250 <= x <= 5000


In[4]:= pts2 = { {2,0.08}, {5,0.8}, {2.5,0.75}, {4,4}, {3, 9} };

In[5]:= LinearFunction[g, pts2]

In[6]:= ?g
Global`g

g[x_] := 0.08 + (x - 2)*1.34 /; 2 <= x <= 2.5
 
g[x_] := 0.75 + (x - 2.5)*16.5 /; 2.5 <= x <= 3
 
g[x_] := 9 + (x - 3)*-5 /; 3 <= x <= 4
 
g[x_] := 4 + (x - 4)*-3.2 /; 4 <= x <= 5


-- 
 ___________________________________________________________________________________
 Levent Kitis           lk3a at cars.mech.virginia.edu    lk3a at kelvin.seas.virginia.edu
 University of Virginia Department of Mechanical, Aerospace, and Nuclear Engineering  
 ___________________________________________________________________________________


  • Prev by Date: symbolic computation in statistics
  • Next by Date: Novice GUI 2D Plotting Package?
  • Previous by thread: Re: Piecewise function generator
  • Next by thread: Books on Mma graphics