## Problem Description and Formulation

The phone company aims to maximize its profit by determining the optimal number of regular phones (`x1`) and premium phones (`x2`) to sell per day. The profit per regular phone is $200, and the profit per premium phone is $300. The company faces the following constraints:

1. The daily demand for regular phones is at most 20.
2. The daily demand for premium phones is at most 15.
3. The total number of phones (either type) that can be sold per day is at most 30.
4. The number of regular and premium phones sold must be non-negative.

## Mathematical Formulation

The problem can be formulated as a linear programming problem:

Maximize: `200*x1 + 300*x2`

Subject to:

- `x1 <= 20` (demand constraint for regular phones)
- `x2 <= 15` (demand constraint for premium phones)
- `x1 + x2 <= 30` (total sales constraint)
- `x1 >= 0` (non-negativity constraint for regular phones)
- `x2 >= 0` (non-negativity constraint for premium phones)

## Gurobi Code

```python
import gurobi

def solve_phone_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(lb=0, name="regular_phones")  # Number of regular phones
    x2 = model.addVar(lb=0, name="premium_phones")  # Number of premium phones

    # Objective function: Maximize profit
    model.setObjective(200*x1 + 300*x2, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(x1 <= 20, name="regular_demand_constraint")
    model.addConstr(x2 <= 15, name="premium_demand_constraint")
    model.addConstr(x1 + x2 <= 30, name="total_sales_constraint")

    # Optimize the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: x1 = {x1.varValue}, x2 = {x2.varValue}")
        print(f"Maximum profit: ${200*x1.varValue + 300*x2.varValue}")
    else:
        print("The model is infeasible.")

solve_phone_problem()
```