Solve Linear Function from Set of n Points with Mathematica

  • Context: Mathematica 
  • Thread starter Thread starter radou
  • Start date Start date
  • Tags Tags
    Mathematica
Click For Summary

Discussion Overview

The discussion revolves around obtaining a linear function that connects a given set of points in Mathematica. Participants explore methods to derive a function that accurately represents the points without resorting to interpolation, focusing on both theoretical and practical aspects of function construction.

Discussion Character

  • Technical explanation
  • Mathematical reasoning
  • Debate/contested

Main Points Raised

  • One participant seeks a linear function that connects a set of points exactly, rather than using fitting or interpolation methods.
  • Another participant suggests that fitting n points exactly requires solving a system of n equations for the coefficients of an n-degree polynomial.
  • There is a proposal to construct a total function using Heaviside theta functions to connect segments between points, assuming the points are ordered by increasing x values.
  • Concerns are raised about errors encountered when evaluating the constructed function, particularly regarding the definition of HeavisideTheta at certain points.
  • A suggestion is made to use Piecewise functions instead of HeavisideTheta to avoid evaluation errors and to correctly identify the function value at specific points.
  • Participants discuss the implications of including or excluding endpoints in the Piecewise function definitions, with adjustments suggested to ensure correct domain coverage.

Areas of Agreement / Disagreement

Participants express differing views on the appropriate method to connect the points, with some advocating for exact connections through piecewise linear functions and others suggesting polynomial fitting. The discussion remains unresolved as participants explore various approaches without reaching a consensus.

Contextual Notes

Limitations include potential errors in function evaluation due to variable definitions and the need for careful handling of endpoints in Piecewise functions. The discussion reflects ongoing exploration of mathematical techniques without definitive conclusions.

radou
Homework Helper
Messages
3,149
Reaction score
8
OK, here's a problem I'm trying to solve for my work.

Given a set of n points {(x1, y1), (x2, y2), ... (xn, yn)} I need to obtain a linear function f from the broken line which connects all these points, so that I can the value of f at any point.

I need to do this for two sets of points, i.e. obtain functions f and g, because I have an expression which involves both the values of f and g at specific points.

Thanks in advance for any help.
 
Physics news on Phys.org
Use the functions Fit and FindFit or other related functions. See help on Fit function:

mydata = {{1, 1}, {2, 4}, {3, 8.5}}

myfunction = Fit[mydata, {1, x, x^2}, x]
N[myfunction /. x -> 2.1]
Plot[myfunction, {x, 0, 10}]
 
jackmell, thanks for the reply.

The fitting functons are not what I need, I need to obtain a linear function which directly connects these given points, and not an interpolation for this set of points. Any ideas how to do this?
 
radou said:
jackmell, thanks for the reply.

The fitting functons are not what I need, I need to obtain a linear function which directly connects these given points, and not an interpolation for this set of points. Any ideas how to do this?

Directly as in "exactly"? Well I know you can fit n points exactly to an n-degree polynomial. Gotta' solve a system of n equations in n unknowns for the coefficients I think. Be interesting to set that up in Mathematica. I don't think it has a built-in function to do this however but not sure.
 
radou said:
jackmell, thanks for the reply.

The fitting functons are not what I need, I need to obtain a linear function which directly connects these given points, and not an interpolation for this set of points. Any ideas how to do this?

So like a bunch of lines together? One "linear" function cannot connect all of them unless they all lie on one line.

You can construct a total function that includes those, connecting with heaviside theta functions.

ASSUMING THEY'RE ORDERED in increasing X values:
Code:
data = {{1, 1}, {2, 3}, {3, 7}, {6, 10}};
slopes = Table[(data[[i + 1]][[2]] - data[[i]][[2]])/(data[[i + 1]][[1]] - data[[i]][[1]]), {i, 1, Length[data] - 1}];
yint = Table[(data[[i]][[2]] - slopes[[i]] (data[[i]][[1]])), {i, 1, Length[slopes]}];
functions = Table[slopes[[i]] x + yint[[i]], {i, 1, Length[slopes]}];
totalfunction[x_] =  Sum[HeavisideTheta[data[[i + 1]][[1]] - x] HeavisideTheta[
    x - data[[i]][[1]]] functions[[i]], {i, 1, Length[slopes]}];
Plot[totalfunction[x], {x, 0, 4}]

is something i just whipped up, you can obviously turn everything into just one equation

Code:
fullfunction[x_] = 
 Sum[HeavisideTheta[data[[i + 1]][[1]] - x] HeavisideTheta[x - data[[i]][[1]]] ((data[[i + 1]][[2]] -  data[[i]][[2]])/(data[[i + 1]][[1]] - data[[i]][[1]]) x + (data[[i]][[2]] - slopes[[i]] (data[[i]][[1]])))  , {i, 1, Length[data] - 1}]
 
Hepth, thanks.

When evaluating, I get error messages of type:

"Plot::plnr: totalfunction[x] is not a machine-size real number at x = \
1.6666666666666665`*^-7."

Btw, how can I get the value of this function at a point? For example, the line

"N[totalfunction[2], 2]"

returns

"6.0 HeavisideTheta[0] HeavisideTheta[
1.0] + 6.0 HeavisideTheta[-1.0] HeavisideTheta[4.0]"
 
Ah, its because heavisidetheta isn't defined at those points. Try piecewise instead:
replace the totalfunction in the above code with this
Code:
totalfunction[x_] = 
 Piecewise[Table[{functions[[i]], data[[i]][[1]] <= x <= data[[i + 1]][[1]]}, {i, 1, Length[slopes]}]]
 
Hm, for some reason, I still get the same error message when trying to plot the functions.

Btw:

"In[18]:=
totalfunction[3]

Out[18]=
Piecewise[{{5,False},{7,True},{7,True}}]"

Is there a way Mathematica can recognize that 3 is in the domain of the second function, and give its value at this function only?

This function will be a parameter in another function, so I only need the value of one of the piecewise it consists of, depending in which domain the value is.
 
try resetting mathematica by
evaluation> quit kernel local (or whatever)

The FALSE, TRUE stuff means you have defined "x" somewhere. If you need to in all my code rename "x" to "X" or something.

or Clear[x]

From a clear start I have
Code:
data = {{1, 1}, {2, 3}, {3, 7}, {6, 10}};
slopes = Table[(data[[i + 1]][[2]] - 
      data[[i]][[2]])/(data[[i + 1]][[1]] - data[[i]][[1]]), {i, 1, 
    Length[data] - 1}];
yint = Table[(data[[i]][[2]] - slopes[[i]] (data[[i]][[1]])), {i, 1, 
    Length[slopes]}];
functions = Table[slopes[[i]] x + yint[[i]], {i, 1, Length[slopes]}];
totalfunction[x_] = 
 Piecewise[
  Table[{functions[[i]], 
    data[[i]][[1]] <= x <= data[[i + 1]][[1]]}, {i, 1, 
    Length[slopes]}]]
Plot[totalfunction[x], {x, 0, 4}]
totalfunction[3]
which gives
Out->
[tex] \begin{cases}<br /> 2 x-1 & 1\leq x\leq 2 \\<br /> 4 x-5 & 2\leq x\leq 3 \\<br /> x+4 & 3\leq x\leq 6<br /> \end{cases}[/tex]
and the plot
then
7
 
Last edited:
  • #10
Also, 3 is in the domain of both functions, I guess you can just change one of your less than equal to signs to less than, that way it won't be inclusive of both functions (though they're the same value), I just did it so it included the end points in each function as well, though you can prescribe it to only one if needed.:

Code:
data = {{1, 1}, {2, 3}, {3, 7}, {6, 10}};
slopes = Table[(data[[i + 1]][[2]] - 
      data[[i]][[2]])/(data[[i + 1]][[1]] - data[[i]][[1]]), {i, 1, 
    Length[data] - 1}];
yint = Table[(data[[i]][[2]] - slopes[[i]] (data[[i]][[1]])), {i, 1, 
    Length[slopes]}];
functions = Table[slopes[[i]] x + yint[[i]], {i, 1, Length[slopes]}];
totalfunction[x_] = 
 Piecewise[
  Table[{functions[[i]], 
    If[i == Length[slopes], data[[i]][[1]] <= x <= data[[i + 1]][[1]],
      data[[i]][[1]] <= x < data[[i + 1]][[1]]]}, {i, 1, 
    Length[slopes]}]]
Plot[totalfunction[x], {x, 0, 4}]
totalfunction[3]

That way the last function includes both the preceeding point as well as the final one, though every other segment only includes the leading point.
 
  • #11
I'll try this out tomorrow.

Thanks a lot for your help. :)
 

Similar threads

  • · Replies 19 ·
Replies
19
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 4 ·
Replies
4
Views
1K
  • · Replies 0 ·
Replies
0
Views
1K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 3 ·
Replies
3
Views
7K
Replies
5
Views
4K
  • · Replies 14 ·
Replies
14
Views
4K