Faits : A. La caisse mutuelle X._ - Assurance (ci-après: la bailleresse) a acquis, pour un prix de 5'300'000 fr. (auquel il faut ajouter les frais d'acquisition d'un montant de 194'900 fr.), l'immeuble situé au chemin de..., dans la commune de Mont-sur-Rolle. L'entier du capital a été payé au moyen des fonds propres de la bailleresse. Par contrat du 4 mai 2010, Y._ et Z._ (ci-après: les locataires) ont pris à bail un appartement de 4,5 pièces au 4e étage de cet immeuble, comprenant notamment un " salon avec cheminée ". Initialement fixé à 2'050 fr., plus 210 fr. à titre d'acompte de charges, le loyer mensuel net a été abaissé à 1'894 fr. dès le 1er juillet 2013 à la requête des locataires, sur la base du taux hypothécaire de référence. En juillet 2013, la bailleresse a informé les locataires que, pour des raisons techniques, l'utilisation de la cheminée se trouvant dans le logement n'était plus autorisée. En 2013, la bailleresse a entrepris une rénovation de l'immeuble. Les travaux à plus-value se sont montés à 879'899 fr. Par courrier recommandé du 10 janvier 2014, la bailleresse a notifié aux locataires une formule de hausse de loyer de 183 fr., avec effet au 1er juin 2014, le loyer net passant de 1'894 fr. à 2'077 fr. Les locataires ont contesté cette hausse au motif qu'elle était nulle, subsidiairement abusive. La conciliation ayant échoué, la bailleresse a reçu l'autorisation de procéder. B. Par demande du 1er mai 2014, la bailleresse a conclu à ce que le Tribunal des baux du canton de Vaud valide la majoration de loyer du 10 janvier 2014 et condamne les locataires à s'acquitter de toute différence de loyer depuis le mois de juin 2014 jusqu'au mois de l'entrée en force du jugement, intérêts en sus. Les locataires ont conclu au rejet de la demande et, reconventionnellement, à ce que le loyer mensuel net soit fixé à 1'799 fr. dès le 1er août 2013 en raison de l'interdiction de l'utilisation de la cheminée, la bailleresse leur devant le paiement immédiat des loyers perçus en trop pour la période du 1er juillet 2013 à l'entrée en force du jugement. En audience, les locataires ont pris une nouvelle conclusion invitant le Tribunal des baux à dire que le loyer mensuel net de l'appartement de 4,5 pièces est diminué de 2,8% (baisse du taux hypothécaire) dès le 1er juin 2015, portant ainsi le loyer mensuel net à 1'748 fr. Par jugement du 15 octobre 2014, le Tribunal des baux a réduit le loyer mensuel net de l'appartement à 1'846 fr.65 dès le 1er octobre 2013 (en raison du défaut de la cheminée), dit que la bailleresse est tenue de restituer aux locataires, créanciers solidaires, les montants versés en trop à titre de loyer jusqu'au jour de l'entrée en force du jugement, fixé le loyer mensuel net des locataires à 1'795 fr.05 dès le 1er juin 2015 (baisse du taux hypothécaire), en fonction du taux de 2%, de l'indice suisse des prix à la consommation de 103.3 points et des charges d'exploitation arrêtées au 31 décembre 2013, et rejeté toutes autres conclusions. Par arrêt du 3 août 2015, la Cour d'appel civile du Tribunal cantonal vaudois a rejeté l'appel formé par la bailleresse et confirmé le jugement attaqué. C. La bailleresse exerce un recours en matière civile au Tribunal fédéral contre l'arrêt cantonal du 3 août 2015. Elle conclut à son annulation, à ce que la majoration de loyer notifiée le 10 janvier 2014 soit validée, à ce qu'il soit dit que le loyer mensuel brut de l'appartement est fixé à 2'077 fr. dès le 1er juin 2014, sur la base d'un taux hypothécaire à 2% et d'un indice suisse des prix à la consommation de 103,3 points, à ce que les locataires soient condamnés à s'acquitter de la différence de loyer depuis le mois de juin 2014 jusqu'au mois de l'entrée en force de l'arrêt, intérêts en sus, et à ce que les locataires soient déboutés de toutes autres conclusions. Elle invoque une violation des art. 26 et 109 Cst., des art. 269 ss CO et elle se prévaut d'une constatation manifestement inexacte des faits au sens des art. 97 et 105 LTF. Les intimés concluent au rejet du recours et à la confirmation de l'arrêt entrepris.