Faits : A. X._ SA a notamment pour but de fabriquer et commercialiser du matériel industriel destiné au traitement des déchets. Y._ GmbH, en Autriche, est active dans le même domaine; U._ est son directeur. Le 12 août 2009, X._ SA a convenu d'une « collaboration temporaire » (Temporäre Zusammenarbeit) avec Y._ GmbH et son directeur. Ceux-ci se chargeaient de sa représentation exclusive dans le cadre d'un projet de la ville de Vienne, laquelle avait récemment publié un appel d'offres pour la fourniture d'une installation de broyage et de tri des déchets. Rédigée sur le papier à en-tête de X._ SA, la convention promettait aux représentants une commission de 3% sur le prix net - TVA non comprise - du matériel à livrer par X._ SA. Cette provision était due si un contrat était conclu entre X._ SA et le client final, ou si ce dernier exigeait du constructeur l'installation d'une déchiqueteuse X._. La convention était conclue pour la durée du projet; elle prenait fin au plus tard le 31 décembre 2010 si aucun contrat n'était conclu à ce moment ( ... falls bis zu diesem Zeitpunkt kein Vertrag abgeschlossen wurde). Selon les allégations de Y._ GmbH et de son directeur, tous deux se sont très activement efforcés d'orienter le choix de l'adjudicateur sur les produits de X._ SA, et ils y sont parvenus en ce sens que l'adjudicateur a effectivement imposé le fournisseur et le modèle d'une déchiqueteuse dans un descriptif de l'installation (Leistungsverzeichnis) daté de juillet 2010. Le 16 mars 2011, l'adjudicataire Z._ GmbH a passé commande auprès de X._ SA de deux appareils du modèle ainsi désigné; il a en outre commandé neuf portes de fosse (Bunkerklappen). Sa commande portait sur un prix global de 1'675'000 euros. Dans l'intervalle, en avançant qu'un certain résultat était déjà atteint avec le descriptif établi par l'adjudicateur, Y._ GmbH avait proposé la prolongation de la convention du 12 août 2009 pour une durée indéterminée. X._ SA a rejeté cette proposition le 24 décembre 2010. B. Le 15 mars 2012, Y._ GmbH et U._ ont conjointement ouvert action contre X._ SA devant le Tribunal régional du Littoral neuchâtelois et du Val-de-Travers. La défenderesse devait être condamnée à payer 51'600 euros à titre de commission, avec intérêts au taux de 5% par an dès le 1er septembre 2011. La défenderesse a conclu au rejet de l'action. Le tribunal s'est prononcé le 16 octobre 2013; il a condamné la défenderesse à payer aux demandeurs, créanciers solidaires, 50'250 euros avec intérêts au taux de 5% par an, dès le 1er septembre 2011. La défenderesse a appelé du jugement pour conclure au rejet de l'action. Les demandeurs ont usé de l'appel joint afin d'obtenir une prestation supplémentaire de 4'195,85 euros, avec intérêts. La Cour d'appel civile du Tribunal cantonal a statué le 30 septembre 2014; elle a rejeté les deux appels et confirmé le jugement. C. Agissant par la voie du recours en matière civile, la défenderesse requiert le Tribunal fédéral de réformer l'arrêt de la Cour d'appel en ce sens que l'action soit entièrement rejetée. Les demandeurs concluent au rejet du recours. La défenderesse a spontanément déposé une réplique.