diff --git a/fitbenchmarking/fitting/controllers/dfogn_controller.py b/fitbenchmarking/fitting/controllers/dfogn_controller.py
index 328f62ae..ae6fc1cc 100644
--- a/fitbenchmarking/fitting/controllers/dfogn_controller.py
+++ b/fitbenchmarking/fitting/controllers/dfogn_controller.py
@@ -31,8 +31,7 @@ class DFOGNController(Controller):
         self._pinit = np.asarray(self.initial_params)
 
     def _prediction_error(self, p):
-        f = self.data_y - self.problem.eval_f(x=self.data_x,
-                                              params=p,
+        f = self.data_y - self.problem.eval_f(params=p,
                                               function_id=self.function_id)
         if self.use_errors:
             f = f/self.data_e
@@ -59,7 +58,6 @@ class DFOGNController(Controller):
         will be read from.
         """
         if self.success:
-            self.results = self.problem.eval_f(x=self.data_x,
-                                               params=self._popt,
+            self.results = self.problem.eval_f(params=self._popt,
                                                function_id=self.function_id)
             self.final_params = self._popt
diff --git a/fitbenchmarking/fitting/controllers/minuit_controller.py b/fitbenchmarking/fitting/controllers/minuit_controller.py
index cf5fe91a..640aefdb 100644
--- a/fitbenchmarking/fitting/controllers/minuit_controller.py
+++ b/fitbenchmarking/fitting/controllers/minuit_controller.py
@@ -43,8 +43,7 @@ class MinuitController(Controller):
                                                       errordef=1)
 
     def _prediction_error(self, p):
-        f = self.problem.eval_f(x=self.data_x,
-                                params=p,
+        f = self.problem.eval_f(params=p,
                                 function_id=self.function_id)
         f = f - self.data_y
         if self.use_errors:
@@ -68,7 +67,6 @@ class MinuitController(Controller):
         self.success = (self._popt is not None)
 
         if self.success:
-            self.results = self.problem.eval_f(x=self.data_x,
-                                               params=self._popt,
+            self.results = self.problem.eval_f(params=self._popt,
                                                function_id=self.function_id)
             self.final_params = self._popt
diff --git a/fitbenchmarking/fitting/controllers/ralfit_controller.py b/fitbenchmarking/fitting/controllers/ralfit_controller.py
index 951ab5af..8765e089 100644
--- a/fitbenchmarking/fitting/controllers/ralfit_controller.py
+++ b/fitbenchmarking/fitting/controllers/ralfit_controller.py
@@ -44,8 +44,7 @@ class RALFitController(Controller):
             raise RuntimeError("An undefined RALFit minmizer was selected")
 
     def _prediction_error(self, p):
-        f = self.problem.eval_f(x=self.data_x,
-                                params=p,
+        f = self.problem.eval_f(params=p,
                                 function_id=self.function_id)
         f = f - self.data_y
         if self.use_errors:
@@ -76,7 +75,6 @@ class RALFitController(Controller):
         will be read from.
         """
         if self.success:
-            self.results = self.problem.eval_f(x=self.data_x,
-                                               params=self._popt,
+            self.results = self.problem.eval_f(params=self._popt,
                                                function_id=self.function_id)
             self.final_params = self._popt
diff --git a/fitbenchmarking/fitting/controllers/scipy_controller.py b/fitbenchmarking/fitting/controllers/scipy_controller.py
index 33d1f955..38e5beb6 100644
--- a/fitbenchmarking/fitting/controllers/scipy_controller.py
+++ b/fitbenchmarking/fitting/controllers/scipy_controller.py
@@ -50,7 +50,6 @@ class ScipyController(Controller):
         will be read from.
         """
         if self.success:
-            self.results = self.problem.eval_f(x=self.data_x,
-                                               params=self._popt,
+            self.results = self.problem.eval_f(params=self._popt,
                                                function_id=self.function_id)
             self.final_params = self._popt
diff --git a/fitbenchmarking/parsing/fitting_problem.py b/fitbenchmarking/parsing/fitting_problem.py
index 43c05c14..b7365f22 100644
--- a/fitbenchmarking/parsing/fitting_problem.py
+++ b/fitbenchmarking/parsing/fitting_problem.py
@@ -50,16 +50,16 @@ class FittingProblem:
         # Executable param pairs
         self.functions = None
 
-    def eval_f(self, x, params, function_id):
+    def eval_f(self, params, function_id, x=None):
         """
         Function evaluation method
 
-        :param x: x data values
-        :type x: numpy array
         :param params: parameter value(s)
         :type params: list
         :param function_id: The index of the function in functions
         :type function_id: int
+        :param x: x data values or None, if None this uses self.data_x
+        :type x: numpy array
 
         :return: y data values evaluated from the function of the problem
         :rtype: numpy array
@@ -67,6 +67,9 @@ class FittingProblem:
         if self.functions is None:
             raise AttributeError('Cannot call function before setting'
                                  + 'functions in object.')
+
+        if x is None:
+            x = self.data_x
         function = self.functions[function_id][0]
         return function(x, *params)
 

Add a default value for x in FittingProblem.eval_f
Every evaluation of this is going to occur at self.data_x.
This already wrapped by some controllers to give a function which only takes parameters as an argument.

We should make self.data_x a default, which will accommodate all of the controllers
diff --git a/fitbenchmarking/parsing/tests/test_fitting_problem.py b/fitbenchmarking/parsing/tests/test_fitting_problem.py
index f97a8e4b..b9cca333 100644
--- a/fitbenchmarking/parsing/tests/test_fitting_problem.py
+++ b/fitbenchmarking/parsing/tests/test_fitting_problem.py
@@ -70,6 +70,10 @@ class TestFittingProblem(TestCase):
                                              params=[5],
                                              function_id=1)
         self.assertTrue(all(eval_result == np.array([16])))
+        fitting_problem.data_x = np.array([20, 21, 22])
+        eval_result = fitting_problem.eval_f(params=[5],
+                                             function_id=0)
+        self.assertTrue(all(eval_result == np.array([25, 26, 27])))
 
     def test_eval_starting_params(self):
         """

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gfortran lcov libblas-dev liblapack-dev
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
bumps==0.9.3
certifi==2021.5.30
chardet==3.0.4
charset-normalizer==2.0.12
configparser==5.2.0
coverage==6.2
coveralls==3.3.1
cycler==0.11.0
DataProperty==0.46.4
DFOGN==1.0.2
docopt==0.6.2
docutils==0.18.1
-e git+https://github.com/fitbenchmarking/fitbenchmarking.git@6a41e646051513f80570287b96796f879534b072#egg=FitBenchmarking
idna==3.10
iminuit==2.16.0
importlib-metadata==4.8.3
iniconfig==1.1.1
Jinja2==3.0.3
kiwisolver==1.3.1
lxml==5.3.1
MarkupSafe==2.0.1
matplotlib==2.2.5
mbstrdecoder==0.8.4
msgfy==0.0.7
numpy==1.16.6
packaging==21.3
pandas==0.24.2
pathvalidate==0.29.1
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytablewriter==0.46.1
pytest==7.0.1
pytest-cov==4.0.0
python-coveralls==2.9.3
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.1
requests==2.27.1
sasmodels==1.0.9
scipy==1.2.3
six==1.17.0
tabledata==0.10.4
tinycc==1.1
tomli==1.2.3
typepy==0.6.6
typing_extensions==4.1.1
urllib3==1.23
zipp==3.6.0

name: fitbenchmarking
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - bumps==0.9.3
      - chardet==3.0.4
      - charset-normalizer==2.0.12
      - configparser==5.2.0
      - coverage==6.2
      - coveralls==3.3.1
      - cycler==0.11.0
      - dataproperty==0.46.4
      - dfogn==1.0.2
      - docopt==0.6.2
      - docutils==0.18.1
      - idna==3.10
      - iminuit==2.16.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - kiwisolver==1.3.1
      - lxml==5.3.1
      - markupsafe==2.0.1
      - matplotlib==2.2.5
      - mbstrdecoder==0.8.4
      - msgfy==0.0.7
      - numpy==1.16.6
      - packaging==21.3
      - pandas==0.24.2
      - pathvalidate==0.29.1
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytablewriter==0.46.1
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-coveralls==2.9.3
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.27.1
      - sasmodels==1.0.9
      - scipy==1.2.3
      - six==1.17.0
      - tabledata==0.10.4
      - tinycc==1.1
      - tomli==1.2.3
      - typepy==0.6.6
      - typing-extensions==4.1.1
      - urllib3==1.23
      - zipp==3.6.0
prefix: /opt/conda/envs/fitbenchmarking

fitbenchmarking/parsing/tests/test_fitting_problem.py::TestFittingProblem::test_eval_f
fitbenchmarking/parsing/tests/test_fitting_problem.py::TestFittingProblem::test_eval_starting_params fitbenchmarking/parsing/tests/test_fitting_problem.py::TestFittingProblem::test_get_function_def fitbenchmarking/parsing/tests/test_fitting_problem.py::TestFittingProblem::test_verify_problem
fitbenchmarking/fitting/controllers/ralfit_controller.py fitbenchmarking/parsing/fitting_problem.py fitbenchmarking/fitting/controllers/minuit_controller.py fitbenchmarking/fitting/controllers/dfogn_controller.py fitbenchmarking/fitting/controllers/scipy_controller.py
fitbenchmarking/fitting/controllers/ralfit_controller.py fitbenchmarking/parsing/fitting_problem.py fitbenchmarking/fitting/controllers/minuit_controller.py fitbenchmarking/fitting/controllers/dfogn_controller.py fitbenchmarking/fitting/controllers/scipy_controller.py