【发布时间】: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