2011-04-07 71 views
4

我設計的算法來定義在區間[a,b]上問題找到一個函數的局部最大值用C

#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)的局部最大值的簡單方法

該算法實現函數f(x)= A * sin(pi * x),其中A是我的ID的數字的平均值,並且inf變量被賦予一個數值,該數值遠大於區間[a,b] = [0.1]中的函數。

該算法必須找到該函數的局部最大值,但它的最大回報總是爲零。不明白爲什麼。我的解決方案的邏輯可能是什麼問題?,這個問題可以通過這個簡單的算法來解決,或者通過回溯來進行一些優化是必要的?感謝您的迴應。

+0

'int A = 4.875;'?哎呀:) – sarnold 2011-04-07 00:42:09

+0

yeap一個簡單的錯誤...但是無關緊要..變量A可以取任何值 – franvergara66 2011-04-07 00:56:40

+0

在某些時候,你會考慮減少'funtion _()',所以你不要初始化結果爲0,然後再次設置它。但編譯器/優化器也可能會這樣做。 – 2011-04-07 01:51:46

回答

3

這段代碼有幾個問題;可能是最明顯的是:

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

你不能比較的int和平等float。它可能會工作一次,因爲愚蠢的運氣:)但你不能指望這個代碼可靠地運作。

我強烈建議您更改所有int變量double,所有float變量double,所有的scanf(3)printf(3)調用相匹配。雖然你可以在一個程序中結合了不同的原始數字類型,甚至在一個表達式或語句中,執行中的細微差別將花費你幾個小時的時間來發現。

此外,比較浮點格式的相等性幾乎不是一個好主意。相反,比較差異兩個數字之間的小量值:

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

,使之與問題的嚴重程度相匹配,您可能想規模您的小量;因爲float真的只支持大約七個位的精度,這種比較就不能很好的工作:

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

您可能希望找到一個很好的介紹numerical analysis。 (順便說一句,早在學校我最喜歡的課程之一。:)

更新

問題的核心是你的while(x == b)。我固定的和一些較小的問題,而這個代碼似乎工作: 的#include 的#include 的#include 的#define PI 3.141592653 浮動funtion_(浮起,浮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 
$ 
+0

,但將變量的所有值更改爲加倍,甚至仍然給我零局部最大值。什麼可能做錯了。 – franvergara66 2011-04-07 01:08:16

0

你正在做你的計算,特別是用整數運算初始化h。因此,在語句:

h = (b-a)/N; 

ab,和N均爲整數所以表達式作爲一個整數表達式求值,並然後轉換爲float用於分配給h。您可能會發現h的值爲零。請嘗試h計算後加入如下一行:

printf("h = %f\n", h); 

您已經解決了之後做浮點計算,你需要修復您的while循環。條件x = b絕對不是你想要的(我注意到它在格式編輯之前最初是x == b,但那也不正確)。

+0

是的你是對的這是一個錯誤的代碼 – franvergara66 2011-04-07 00:49:37

+0

代碼是固定的,但仍然給我的本地最大值負值inf – franvergara66 2011-04-07 00:55:41

+0

你還沒有解決'x == b'的問題。這不是正確的循環終止條件。你將不得不解決這個問題。 (您的循環只運行一次。) – 2011-04-07 01:20:34

0

如若而條件是:當(X < = B)

0

而(X = B);

無法退出循環。 b總是1.

+0

代碼已修復,但仍然給我瞭解您的想法的局部最大值負值inf – franvergara66 2011-04-07 00:57:15

相關問題