To solve David's problem, we first need to define the variables and the objective function symbolically. Let's denote:

- $x_1$ as the amount of regular supplementation in grams.
- $x_2$ as the amount of premium supplementation in grams.

The objective is to minimize the total cost. The cost of regular supplementation per gram is $0.04, and the cost of premium supplementation per gram is $0.08. Therefore, the objective function can be written as:

\[ \text{Minimize: } 0.04x_1 + 0.08x_2 \]

The constraints are based on the minimum requirements for iron and calcium. Since regular supplementation consists of 20% iron and 30% calcium, and premium supplementation consists of 25% iron and 40% calcium, we can set up the following inequalities to represent the requirements:

- For iron: $0.20x_1 + 0.25x_2 \geq 30$
- For calcium: $0.30x_1 + 0.40x_2 \geq 50$

Additionally, since we cannot have a negative amount of supplementation, we also have:

- $x_1 \geq 0$
- $x_2 \geq 0$

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'regular supplementation'), ('x2', 'premium supplementation')],
    'objective_function': '0.04*x1 + 0.08*x2',
    'constraints': ['0.20*x1 + 0.25*x2 >= 30', '0.30*x1 + 0.40*x2 >= 50', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this problem using Gurobi in Python:
```python
from gurobipy import *

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

# Add variables
x1 = m.addVar(lb=0, name="regular_supplementation")
x2 = m.addVar(lb=0, name="premium_supplementation")

# Set the objective function
m.setObjective(0.04*x1 + 0.08*x2, GRB.MINIMIZE)

# Add constraints
m.addConstr(0.20*x1 + 0.25*x2 >= 30, "iron_requirement")
m.addConstr(0.30*x1 + 0.40*x2 >= 50, "calcium_requirement")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Regular supplementation: {x1.x} grams")
    print(f"Premium supplementation: {x2.x} grams")
    print(f"Total cost: ${0.04*x1.x + 0.08*x2.x:.2f}")
else:
    print("No optimal solution found")
```