Julia
Julia

Reputation: 704

How to fix the procedure

Help me, please! There's the procedure operation[f_]. It works correctly and plot for functions:Cos,Sin. But, Unfortunately, it doesn't work for E^x and Log[E,x] and outputs errors, maybe because inputting not correct name of function or something else;(( What's the problem?

spxsin = {-1, -0.35, 0.3, 0.95, 1.6, 2.375, 3.15, 3.925, 4.7, 5.025, 
5.35, 5.675, 6};
spxcos = {-1, -0.75, -0.5, -0.25, 0, 0.775, 1.55, 2.325, 3.1, 3.825, 
4.55, 5.275, 6};
spxlny = {-1, 0.75, 2.5, 4.25, 6};
spxey = {-1, 0.75, 2.5, 4.25, 6};
operation[f_] := Block[{data},
data = Table[{x, f[x]}, {x, -1, 6, 0.1}];
Graphics[{Thick, Blue, Line[data],
Green, Table[Point[{spx[­[i]], f[spx[­[i]]]}], {i, 1, Length[spx]}],
Pink, Opacity[.7], 
Table[Rectangle[{spx[­[i]], f[spx[­[i]]]}, {spx[­[i + 1]], 
f[spx[­[i + 1]]]}], {i, 1, Length[spx] - 1}]
}, Axes -> True]]

Which[ f == Sin, spx := spxsin, f == Cos, spx := spxcos, f == E^x , 
spx := spxlny, f == Log, spx := spxey]

operation[Sin]
operation[Cos]
operation[E^x]
operation[Log]

Upvotes: 2

Views: 90

Answers (2)

agentp
agentp

Reputation: 6999

Edit now tested: you can pass pure functions to your operation, so instead of: operation[E^x] try

 operation[E^# &]

or for example if you wanted a base 2 log it would be

 operation[Log[2,#]&]

A few other things to point out: Log fails simply because your x table range is negative.

Also, the Which statement you have doesn't do anything. Being outside your function, f is not defined so none of the conditionals are True. Moving Which inside the function, this works:

 spxsin = {-1, -0.35, 0.3, 0.95, 1.6, 2.375, 3.15, 3.925, 4.7, 5.025, 
    5.35, 5.675, 6};
 spxcos = {-1, -0.75, -0.5, -0.25, 0, 0.775, 1.55, 2.325, 3.1, 3.825, 
   4.55, 5.275, 6};
 spxlny = {-1, 0.75, 2.5, 4.25, 6};
 spxey = {-1, 0.75, 2.5, 4.25, 6};
 operation[f_] := 
    Block[{data}, data = Table[{x, f[x]}, {x, -1, 6, 0.1}];
    Clear[spx];
    Which[
      TrueQ[f == Sin], spx := spxsin,
      TrueQ[f == Cos], spx := spxcos ,
      TrueQ[f == (E^# &)], spx := spxey ];
    Graphics[{Thick, Blue, Line[data], Green,
     Table[{PointSize[.1], Point[{spx[[i]], f[spx[[i]]]}]}, {i, 1, Length[spx]}],
     Pink, Opacity[.7], 
     Table[Rectangle[{spx[[i]], f[spx[[i]]]}, {spx[[i + 1]], 
       f[spx[[i + 1]]]}], {i, 1, Length[spx] - 1}]}, Axes -> True, 
          AspectRatio -> 1/GoldenRatio]]

Note each which test is wrapped in TrueQ to ensure it is either True or False ( the test Sin==Cos is not false for all values and so does not return False )

 operation[Sin]
 operation[Cos]
 operation[E^# &]

enter image description here

Now if you want Exp to also work you need to explicitly put that form in your Which statement. ( f==(E^#&) || f==Exp )

Upvotes: 2

soegaard
soegaard

Reputation: 31145

Euler's E needs to be entered as Esc ee Esc. It looks to me at you entered is a standard E.

Note also that Exp is the exponential function in Mathematica.

Upvotes: 1

Related Questions