【问题标题】:Update values of array when a specific element is changed更改特定元素时更新数组的值
【发布时间】:2016-05-26 11:06:39
【问题描述】:

假设我定义了一个名为computeValue (double x)的函数:

  1. 其输入是双精度值
  2. 返回一个值,该值是通过使用数组的元素执行一组特定的操作获得的,如下所述。

另外,我们还有上面提到的array那个

  1. 是某个类的成员
  2. 仅包含 4 个位置。
  3. 第 1 个位置包含某个值,第 4 个位置包含另一个值,将作为我们函数的输入
  4. (棘手的地方来了),数组的第二个和第三个值应该是数组的位置 1 和 4 之间的线性插值的结果。也就是说,如果我们修改数组的位置 1 或 4,那么位置 2 和 3 应该会根据插值方法自动改变它们的值。

我的目标是调用寻根算法(例如 Newton-Raphson、正割法等),旨在最小化以下表达式:

f = CONSTANT - computeValue(array[4])

正如您可能已经观察到的那样,问题是每次我的寻根例程修改数组的第 4 个元素以获得新的解决方案时,我的数组的位置 2 和 3 应该相应地修改,因为它们是插值的结果(如上面第 4 点所述),从而改变了computeValue 的结果。

当根查找算法朝着根方向工作时,使数组的值动态变化的可能方法是什么?也许与存储定义插值的 lambda 表达式的数组有关?

【问题讨论】:

    标签: c# arrays algorithm newtons-method linear-interpolation


    【解决方案1】:

    经典数组无法做到这一点,但您可以实现自己的类型来解决问题。此类型在内部使用长度为 4 的数组,并通过

    提供访问
    public int this[int index]    
    {
        // get and set accessors
    }
    

    在这里,您可以编写自己的 getter 和 setter,以便在更改其他值时立即重新计算值。

    【讨论】:

      【解决方案2】:

      不要让自己对数组索引感到困惑,这似乎是创建自己的对象的好时机。您可以使用JF Meier's approach 并手动创建或扩充数组类。但我建议完全创建一个新对象。您可以使插值点仅获得返回正确插值的属性。您的对象可能如下所示:

      public class Interpolator
      {
          public double Constant {get; set;} //same as your array[0]
          public double Value {get; set;}    //same as your array[3]
      
          public double Interpolation1 { get { return CalculateInterpolation1(); } }
          public double Interpolation2 { get { return CalculateInterpolation2(); } }
      
          private double CalculateInterpolation1()
          {
              //define your interpolation here
          }
      
          private double CalculateInterpolation2()
          {
              //define your interpolation here
          }       
      }
      

      简短的.Net Fiddle demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 2012-04-16
        • 2018-12-14
        • 2012-03-04
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多