       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:= pts = {{20,0.08},{50,0.8},{250,0.8},{5000,0.004}};

In:= LinearFunction[f, pts]

In:= ?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:= pts2 = { {2,0.08}, {5,0.8}, {2.5,0.75}, {4,4}, {3, 9} };

In:= LinearFunction[g, pts2]

In:= ?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