To solve Thomas's problem of minimizing the cost of feeding his cows while ensuring they receive the required nutrition, we can formulate this as a linear programming problem. The decision variables will be the amount of silage and mixed grains to feed each cow per day.

Let:
- \(x_s\) be the kilograms of silage fed to each cow per day.
- \(x_m\) be the kilograms of mixed grains fed to each cow per day.

The objective is to minimize the total cost of feeding 50 cows. The constraints are based on the nutritional requirements for each cow and the limitations on vitamins intake.

Given:
- Cost of silage: $215 per kilogram
- Cost of mixed grains: $320 per kilogram
- Protein in silage: 0.5 kilograms per kilogram
- Vitamins in silage: 0.2 kilograms per kilogram
- Minerals in silage: 0.1 kilograms per kilogram
- Protein in mixed grains: 0.2 kilograms per kilogram
- Vitamins in mixed grains: 0.1 kilograms per kilogram
- Minerals in mixed grains: 0.2 kilograms per kilogram
- Minimum protein required per cow: 2 kilograms
- Maximum vitamins allowed per cow: 1.0 kilograms
- Minimum minerals required per cow: 1.5 kilograms

The objective function to minimize is the total cost of feeding all cows:
\[ \text{Minimize} = 215x_s + 320x_m \]

Subject to the constraints for each cow:
1. Protein requirement: \(0.5x_s + 0.2x_m \geq 2\)
2. Vitamin limitation: \(0.2x_s + 0.1x_m \leq 1.0\)
3. Mineral requirement: \(0.1x_s + 0.2x_m \geq 1.5\)

And non-negativity constraints:
- \(x_s \geq 0\)
- \(x_m \geq 0\)

This problem will be solved for a single cow, and the solution will then be scaled up to 50 cows.

```python
from gurobipy import *

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

# Define variables
x_s = m.addVar(name="silage", vtype=GRB.CONTINUOUS, lb=0)
x_m = m.addVar(name="mixed_grains", vtype=GRB.CONTINUOUS, lb=0)

# Objective function: Minimize cost
m.setObjective(215*x_s + 320*x_m, GRB.MINIMIZE)

# Constraints
m.addConstr(0.5*x_s + 0.2*x_m >= 2, name="protein_requirement")
m.addConstr(0.2*x_s + 0.1*x_m <= 1.0, name="vitamin_limitation")
m.addConstr(0.1*x_s + 0.2*x_m >= 1.5, name="mineral_requirement")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Silage per cow: {x_s.x} kg")
    print(f"Mixed grains per cow: {x_m.x} kg")
    print(f"Total cost for 50 cows: ${(215*x_s.x + 320*x_m.x) * 50:.2f}")
else:
    print("No optimal solution found.")
```