To solve Hudson's problem, we first need to define the variables and the objective function symbolically, followed by the constraints.

Let's denote:
- \(x_1\) as the number of acres for growing daisies,
- \(x_2\) as the number of acres for growing peonies.

The objective function is to maximize profit. Given that daisies yield a profit of $150 per acre and peonies yield $180 per acre, the objective function can be written as:
\[ \text{Maximize:} \quad 150x_1 + 180x_2 \]

The constraints are:
1. Total land constraint: Hudson has 55 acres in total, so \(x_1 + x_2 \leq 55\).
2. Plant nutrition constraint: Daisies require 4.5 kg of plant nutrition per acre, and peonies require 7 kg per acre. Hudson wants to use at most 200 kg of plant nutrition, so \(4.5x_1 + 7x_2 \leq 200\).
3. Non-negativity constraint: The number of acres for each type of flower cannot be negative, so \(x_1 \geq 0\) and \(x_2 \geq 0\).

Thus, the symbolic representation of the problem is:
```json
{
  'sym_variables': [('x1', 'acres of daisies'), ('x2', 'acres of peonies')],
  'objective_function': '150*x1 + 180*x2',
  'constraints': ['x1 + x2 <= 55', '4.5*x1 + 7*x2 <= 200', 'x1 >= 0', 'x2 >= 0']
}
```

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

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

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

# Set the objective function
m.setObjective(150*x1 + 180*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 55, name="total_land")
m.addConstr(4.5*x1 + 7*x2 <= 200, name="plant_nutrition")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```