Visualizing the end product can work very well too. Create a sketch or non-functional version of what you're building, just to see what the finished product will look like.
If I was creating Google I'd make a really dead simple app that let you enter a query and returned 10 crappy links. Just to make the work tangible. This lets your brain easily grab onto what success would look like (e.g. 10 highly relevant links vs 10 crappy links).
Is this about coding? I know that once I hit "run" and something breaks my juices will start to flow, so I figure out some way to hit "run" even if I know the code is not ready. Josh's divide and conquer idea would help with this.
Now, it's not based on any scientific paper/literature. It's just a spreadsheet with the following columns:
'Time' , 'Important Task' , 'Distraction' , 'Time Since end of Last Distraction' , 'Distraction Duration'
Each time you stop doing the important task and do something else (like browsing hackernews or checking your IMs) enter a new record with the minimum distraction duration being a minute. After a while you'll really start paying attention to how much time you lose doing unimportant things just to avoid the discomfort of the important task and how it actually drags on the time you spent trying to finish what you started.
Work on / build things that will aid you in solving the problem. This could be organizing code, organizing notes, (reorganizing equations??), building test pages. Anything that you can think of that is intellectually simple that will aid you later when you find your motivation.
Also, after an intense push for a number of hours, go outside and sit, have a coffee or beer or wine or whiskey coke for thirty minutes. Just relax, don't work. And let the most recent effort seep into your subconscious. I often find that my subconscious is better at solving these types of problems than I am.
Now I'm going to take my own advice and get off HN.