The basic solution to this is to use an ISP offering a proper business level service.
However, incoming calls are going to fail for any provider until you next register, even if the remote side uses workarounds, and most of the workarounds for outgoing calls, and in progress incoming ones, need to be done at the provider end, so I’m not clear why chan_pjsip should be worse than chan_sip.
Taking the ‘check from field’ notice at face value, try setting From Domain to sipgate.co.uk
However, it may still fail if the address in Via doesn’t match the address the request was sent from, as in your example.
Why and about how often does your public address change? If noise on the line is causing the DSL modem to lose sync, you may be able to get TalkTalk or BT to fix it, or you may be able to set up the modem and router so a brief sync loss doesn’t result in an address change. If TalkTalk forces a change weekly, you could set up a script to force it (for example) every Sunday at 04:00, then having Asterisk reload with the new address.
It might also be possible to configure the trunk so sipgate accepts the address change without error, but such an arrangement would likely be incompatible with remote extensions and other trunking providers.
Finally, unless you have local trunking resources on the system (POTS, GSM gateway, etc.), consider running the PBX in the cloud where you will have a static public IP address. If your power or internet fails, the system can send calls to mobile phones and remain fully functional.
Try going into General SIP Settings, check NAT Settings - External Address. If there is any IP, delete it and save the setup. If this address is incorrect, it will break, but if blank - should be fine.