gpt4 book ai didi

c - 在 C 中寻找函数的局部最大值的问题

转载 作者:太空狗 更新时间:2023-10-29 15:36:56 25 4
gpt4 key购买 nike

我正在设计一种算法来定义一种简单的方法,该方法能够找到区间 [a, b] 中给定的函数 f (x) 的局部最大值

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.141592653
float funtion_(float a, float x){

float result=0;
result = a * (sin (PI*x));
return result;
}

int main (){
double A = 4.875; //average of the digits of the identification card
double a = 0.0, b =1.0; //maximum and minimum values of the interval [a, b]
double h=0;
double N;
double Max, x;
double sin_;

double inf;
printf ("input the minux value: ");
scanf ("%lf", &inf);
printf ("input the N value: ");

scanf ("%lf", &N);

h= (b-a)/N;
printf("h = %lf\n", h);

x=a-h;
Max = -inf;

do {
x = x+h;
sin_ = funtion_(A, x);
if (sin_>=Max){
Max = sin_;
}
}while (x==b);

printf ("Maximum value: %lf.5", Max);
return 0;
}

算法实现了函数f(x) = A * sin(pi * x),其中A是我ID的位数的平均值,inf变量被赋值一个足够大的数区间 [a, b] = [0.1] 中的函数。

算法必须找到函数的局部最大值,但它返回的最大值始终为零。不明白为什么。我的解决方案的逻辑可能是什么问题?这个问题可以通过这个简单的算法解决,还是需要通过回溯进行一些优化?感谢您的回复。

最佳答案

这段代码有几个问题;可能最明显的是:

int a = 0, b = 1;
float Max, x;
/* ... */
do {
/* ... */
} while (x == b);

您不能比较 intfloat 是否相等。由于运气不好,它可能偶尔会工作一次 :) 但您不能指望这段代码能够可靠地运行。

我强烈建议将所有 int 变量更改为 double,将所有 float 变量更改为 double,并且所有 scanf(3)printf(3) 调用都匹配。虽然您可以在一个程序中组合不同的原始数字类型,甚至在一个表达式或语句中,但执行过程中的细微差别将需要数小时才能发现。

此外,比较浮点格式的相等性几乎从来都不是一个好主意。相反,将两个数字之间的差异epsilon值进行比较:

if (fabs(a-b) < 0.001)
/* consider them equal */

您可能希望缩放您的 epsilon 以使其与您的问题的规模相匹配;由于 float 实际上仅支持大约七位精度,因此这种比较效果不佳:

if (fabsf(123456789 - 123456789.1) < 0.5)
/* oops! fabsf(3) used to force float */
/* and float can't tell the difference */

您可能想找到 numerical analysis 的一个很好的介绍。 (顺便说一下,我在学校最喜欢的类(class)之一。:)

更新

问题的核心是你的while(x == b)。我解决了这个问题和一些小问题,这段代码似乎有效: #包括 #包括 #包括 #define 圆周率 3.141592653 float 函数_( float a, float x) {

    float result = 0;
result = a * (sin(PI * x));
return result;
}

int main()
{
float A = 4.875; //average of the digits of the identification card
float a = 0.0, b = 1.0; //maximum and minimum values of the interval [a, b]
float h = 0;
float N;
float Max, x;
float sin_;

float inf;
printf("\ninput the inf value: ");
scanf("%f", &inf);
printf("\ninput the N value: ");

scanf("%f", &N);

h = (b - a) / N;

x = a - h;
Max = -inf;

do {
x = x + h;
sin_ = funtion_(A, x);
if (sin_ >= Max) {
Max = sin_;
printf("\n new Max: %f found at A: %f x: %f\n", Max, A, x);

}
} while (x < b);

printf("Maximum value: %.5f\n", Max);
return 0;
}

用一些小的输入运行这个程序:

$ ./localmax 

input the inf value: 1

input the N value: 10

new Max: 0.000000 found at A: 4.875000 x: 0.000000

new Max: 1.506458 found at A: 4.875000 x: 0.100000

new Max: 2.865453 found at A: 4.875000 x: 0.200000

new Max: 3.943958 found at A: 4.875000 x: 0.300000

new Max: 4.636401 found at A: 4.875000 x: 0.400000

new Max: 4.875000 found at A: 4.875000 x: 0.500000
Maximum value: 4.87500
$

关于c - 在 C 中寻找函数的局部最大值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com