Ensure the objective function is concave. You can do this either by proof, using the strict definition of concavity or by graphing the function. If you choose to graph the function, analyze the graph by imagining every set of two points on that function. Ask yourself: "If I were to draw a line between these two points, would the function itself lie above that line?" If the answer is affirmative, then the function is concave, and you can convert the nonlinear programming problem to a linear programming problem.
Choose r break points along the x-axis. Call these break points d(1), d(2), ..., d(r). The number of break points you choose is not entirely important; more break points will give a more accurate conversion but will make the resulting problem more complicated.
Find the corresponding values of the function at those break points. Call them c(1), c(2), ..., c(r).
Calculate the slope for each piece of the now-broken function. The slope is easily calculated for the "kth" piece through s(k) = [c(k)-c(k-1)]/[d(k)-d(k-1)].
Rewrite the objective function, using the sums of slopes instead of the original function. If your original objective function was a function of "x," it will now be a function of "x(i)," where each "i" represents the "ith" piece of the function. In other words, you will have the objective function: sum[x(i)*s(i)] for all i.
Rewrite the constraints. For each constraint, replace "x" with sums of "x(i)," as you did for the objective function. In addition, give "x(i)" the upper bound of d(i)-d(i-1). This completes the conversion of the nonlinear programming problem to a linear one.