To solve Joel's diet problem as a linear programming (LP) optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

Let:
- \(x_1\) be the number of servings of chocolate protein shakes.
- \(x_2\) be the number of servings of vanilla meal replacement smoothies.

The objective is to minimize the total cost. The cost per serving for chocolate protein shakes is $8, and for meal replacement smoothies, it's $10. Therefore, the objective function can be represented as:
\[ \text{Minimize:} \quad 8x_1 + 10x_2 \]

The constraints are based on Joel's dietary requirements:
1. **Protein Requirement:** At least 150 units of protein.
   - Each serving of chocolate protein shakes contains 35 units of protein, and each serving of meal replacement smoothies contains 15 units of protein.
   - Therefore, the constraint can be represented as: \(35x_1 + 15x_2 \geq 150\).

2. **Carbohydrate Requirement:** At least 130 units of carbs.
   - Each serving of chocolate protein shakes contains 20 units of carbs, and each serving of meal replacement smoothies contains 25 units of carbs.
   - Therefore, the constraint can be represented as: \(20x_1 + 25x_2 \geq 130\).

3. **Fat Limitation:** No more than 50 units of fat.
   - Each serving of chocolate protein shakes contains 3 units of fat, and each serving of meal replacement smoothies contains 10 units of fat.
   - Therefore, the constraint can be represented as: \(3x_1 + 10x_2 \leq 50\).

4. **Non-Negativity Constraints:** Since Joel cannot consume a negative number of servings of either drink, we have:
   - \(x_1 \geq 0\)
   - \(x_2 \geq 0\)

Given these definitions, the problem can be formulated as an LP problem to minimize cost while meeting Joel's dietary requirements.

Now, let's implement this in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Joel_Diet")

# Define variables
x1 = m.addVar(lb=0, name="Chocolate_Protein_Shakes")
x2 = m.addVar(lb=0, name="Meal_Replacement_Smoothies")

# Objective function: Minimize cost
m.setObjective(8*x1 + 10*x2, GRB.MINIMIZE)

# Constraints
m.addConstr(35*x1 + 15*x2 >= 150, "Protein_Requirement")
m.addConstr(20*x1 + 25*x2 >= 130, "Carbohydrate_Requirement")
m.addConstr(3*x1 + 10*x2 <= 50, "Fat_Limitation")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Chocolate Protein Shakes: {x1.x}")
    print(f"Meal Replacement Smoothies: {x2.x}")
    print(f"Total Cost: ${8*x1.x + 10*x2.x:.2f}")
else:
    print("No optimal solution found")
```