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 ___________________________________________________________________________________