To solve the given problem, we first need to define the variables and the objective function. Let's denote the number of engineers as \(E\) and the number of interns as \(I\). The objective is to minimize the total weekly wages, which can be represented as \(3000E + 750I\).

The constraints are:
1. The total number of workers must be at least 100: \(E + I \geq 100\).
2. At least 20 workers must be interns: \(I \geq 20\).
3. The number of interns must be at least a third the number of engineers: \(I \geq \frac{1}{3}E\).
4. The total weekly payroll must not exceed $200,000: \(3000E + 750I \leq 200,000\).

Now, let's formulate this problem in Gurobi using Python:

```python
from gurobipy import *

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

# Define variables
E = m.addVar(vtype=GRB.CONTINUOUS, name="Engineers")
I = m.addVar(vtype=GRB.CONTINUOUS, name="Interns")

# Objective function: Minimize total wages
m.setObjective(3000*E + 750*I, GRB.MINIMIZE)

# Constraints
m.addConstr(E + I >= 100, "Total_Workers")
m.addConstr(I >= 20, "Minimum_Interns")
m.addConstr(I >= (1/3)*E, "Intern_to_Engineer_Ratio")
m.addConstr(3000*E + 750*I <= 200000, "Payroll_Limit")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Engineers: {E.x}")
    print(f"Interns: {I.x}")
    print(f"Total wages: ${3000*E.x + 750*I.x:.2f}")
else:
    print("No optimal solution found")
```