GPS can find 25 satellites, but it can't go into POSHOLD mode

It’s not about the number of Satellites, it’s about the quality of their signal. If the variance is high, ArduCopter will CORRECTLY prevent you from arming.

It is better than loosing your copter.

Place your antenna better and/wait longer for a low variance, high quality fix.

This has been explained multiple times in this forum, did you had trouble searching?

Thank you very much for your advice, now I have solved the problem. I found that the EK3_SRC1_YAW parameter is set to None, which prevents copter from entering position hold mode. Besides, I would like to ask the ardupilot whether the position control can be carried out without the compass and how to set it.

No, it can not work without a compass unless you use two GNSS receivers configured to provide “GPS for yaw” orientation.