To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints. Let's break down the problem:

- Decision Variables: 
  - \(x_1\): Number of containers of Regular Synthetic oil to be produced.
  - \(x_2\): Number of containers of Premium Synthetic oil to be produced.

- Objective Function:
  - Maximize Profit = \(17.4x_1 + 11.1x_2\)

- Constraints:
  - Substance A constraint: \(25x_1 + 10x_2 \leq 1000\) (since each Regular Synthetic container uses 25 grams of substance A and each Premium Synthetic container uses 10 grams, and there are 1000 grams available).
  - Substance B constraint: \(40x_1 + 25x_2 \leq 500\) (since each Regular Synthetic container uses 40 grams of substance B and each Premium Synthetic container uses 25 grams, and there are 500 grams available).
  - Substance C constraint: \(36x_1 + 40x_2 \leq 900\) (since each Regular Synthetic container uses 36 grams of substance C and each Premium Synthetic container uses 40 grams, and there are 900 grams available).
  - Non-negativity constraints: \(x_1 \geq 0\), \(x_2 \geq 0\) (since the number of containers cannot be negative).

This problem can be solved using linear programming techniques. Here's how we can represent this problem in Gurobi Python code:

```python
from gurobipy import *

# Create a model
m = Model("Oil_Production")

# Decision Variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="Regular_Synthetic", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="Premium_Synthetic", lb=0)

# Objective Function: Maximize Profit
m.setObjective(17.4*x1 + 11.1*x2, GRB.MAXIMIZE)

# Constraints
m.addConstr(25*x1 + 10*x2 <= 1000, "Substance_A")
m.addConstr(40*x1 + 25*x2 <= 500, "Substance_B")
m.addConstr(36*x1 + 40*x2 <= 900, "Substance_C")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Produce {x1.x} containers of Regular Synthetic and {x2.x} containers of Premium Synthetic.")
else:
    print("No optimal solution found.")

```