【问题标题】:C calculation of the gradient of a multidimensional function. (partial derivatives)C计算多维函数的梯度。 (偏导数)
【发布时间】:2021-11-30 02:53:57
【问题描述】:

我尝试实现一个计算梯度的算法,但我什至无法弄清楚它是否正确工作,因为我什至不知道如何用手计算它。

我附上了我试图实现算法的材料。如果有人能举例说明输入数据和结果,我将不胜感激,因为我真的很想弄清楚。而且我想知道我在我的程序中错误地规定了什么。

提前谢谢你。因为我真的被困在这上面了,我不能从死里逃生。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
double f(double x)
{
    return (x * x );
}
int main(int argc, char** argv) {
    double del = 0.1;
    int n;
    scanf_s("%d", &n);
    double* x;
    x = (double*)malloc(n * sizeof(double));
    double* y;
    y = (double*)malloc(n * sizeof(double));
    double* fx;
    fx = (double*)malloc(n * sizeof(double));
    double* fy;
    fy = (double*)malloc(n * sizeof(double));
    double* grad;
    grad = (double*)malloc(n * sizeof(double));
    int i = 0;
    for (i = 0; i < n; i++)
    {
        printf("x[%d] = ", i);
        scanf_s("%lf", &x[i]);
        y[i] = x[i];
        fx[i] = f(x[i]);
    }
    double a = 1 / del;
    for (i = 0; i < n; i++) {
        y[i] = y[i] + del;
        fy[i] = f(y[i]);
        grad[i] = a * (fy[i] - fx[i]);
        y[i] = x[i];

    }
    for (i = 0; i < n; i++) {
    printf("%lf ", grad[i]);
    }

}

更新:

double f(double arr[], int size)
{
    int a = sizeof(arr);
    for (int i = 0; i < size; i++) {
        arr[i] = arr[i] * arr[i];
    }
    return *arr;
}
int main(int argc, char** argv) {
    double del = 0.1;
    int n;
    scanf_s("%d", &n);
    double* x;
    x = (double*)malloc(n * sizeof(double));
    double* y;
    y = (double*)malloc(n * sizeof(double));
    double* fx;
    fx = (double*)malloc(n * sizeof(double));
    double* fy;
    fy = (double*)malloc(n * sizeof(double));
    double* grad;
    grad = (double*)malloc(n * sizeof(double));
    int i = 0;
    for (i = 0; i < n; i++)
    {
        printf("x[%d] = ", i);
        scanf_s("%lf", &x[i]);
        y[i] = x[i];
        fx[i] = f(x,n);
    }
    double a = 1 / del;
    for (i = 0; i < n; i++) {
        y[i] = y[i] + del;
        fy[i] = f(y,n);
        grad[i] = a * (fy[i] - fx[i]);
        y[i] = x[i];

    }
    for (i = 0; i < n; i++) {
    printf("%lf ", grad[i]);
    }

}

【问题讨论】:

  • 你从哪里得到return (x * x );
  • @4386427 很抱歉,我没有真正理解您的问题。我有时在 main 中调用这个函数。
  • 你为什么这样做?任务描述中没有说明
  • 不相关:我建议通过将 x、y、fx、fy 和 grad 放在一个结构中并分配 n 数量的此类结构来简化分配/解除分配。 example
  • @4386427 为什么会这样? x 是一个值数组 f(x) 是一个函数。你认为我应该如何寻找偏导数?

标签: c math multidimensional-array gradient


【解决方案1】:

我建议您在担心函数向量之前手动为单个函数执行此操作。

假设你有一个自变量x和一个函数y = f(x)

  1. 为 x[i] 选择一个值
  2. 计算 y(x[i]) = f(x[i])
  3. 计算 x[i+1] = x[i] + delta
  4. 计算 y(x[i+1]) = f(x[i+1])
  5. x[i] 处导数的前向差分近似为 (y(x[i+1]) - y(x[i])/delta。

还有其他近似导数的方法,但这是一个开始。

一旦这适用于单个函数,很容易看出如何将其扩展到函数向量:将所有这些下标转换为向量。

你应该明白

  1. 自变量 x 是一个向量

  2. 依赖函数 y 是一个向量

  3. y w.r.t. 的衍生物x 表示为 m x n 矩阵,而不是 向量:

    dy[i]/dx[j] for i = 1 to m, j = 1 to n

有n个自变量x和m个依赖函数y。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多