函式極值問題求解 C 實現

2021-10-24 07:16:21 字數 2350 閱讀 3711

對於乙個簡單函式來說,例如

,它的影象存在最大值和最小值,那麼給定乙個區間我們可以利用以下幾種方法進行求解。(0<=x<=100,y的值會給出)

方法1:二分法求解

假定存在極小值在區間內,那麼函式一定是先減後增,利用函式fx求解函式值,函式fdx則為fx函式的導數,利用導數我們可以找到該函式fx的極小值。

doublefx(

double x,

double y)

double

fdx(

double x,

double y)

二分法求解,設定left為左邊界,right為右邊界,則解一定位於left和right之間,當左右邊界之間的差值小於某一精確度時,就認為找到了解。具體操作如下,首先判斷左右邊界差值作為迴圈條件,接著每次迴圈找到左右邊界的中間值,一旦該點導數值小於0,說明該點的右側存在正確解,則將左邊界設定為該點,反之將右邊界縮排,左右邊界通過迴圈不斷的向正確解縮排。滿足某一精確度後即可輸出結果。(注意這裡的函式是比較常規簡單的單調函式

double left=

0.0,right=

100.0

;int count=0;

double preci=

1e-6

;//設定精確度

while

(right-left>preci)

else

}

方法2:牛頓二次迭代

同樣是對常規函式求解,只是牛頓二次迭代可以更快的求得結果,即便結果有些許相差,但是在經過100次以上的迭代後,答案已經很精確了。對於二次迭代,需要對函式進行二次求導,得到一次求導後各點的斜率。

double

fddx

(double x)

首先設定乙個邊界值,對於該邊界值一階導數的值進行判斷,判斷是否接近0點,或者在進行兩百次迴圈後退出。接下來,從右邊界進行縮排,對於該點進行二階求導,在該點做一條函式切線,與x軸相交的點相比於原邊界值一定更接近正確解。具體寫法如下,求一階導的函式值,該函式值除以斜率(也就是該點二階導的值)即為縮排的x距離,在原有邊界上減去該值,即向正確解縮排。

double preci=

1e-8

;//設定精確度

double ans=

100;

int count=0;

while

(fdx

(ans,y)

>preci&&count++

<

200)

方法3:暴力

在已知小範圍內設定乙個很小的變化量,將所有函式值求出,得到該函式在該區間上的極小值。注意時間複雜度避免超時問題。

double ans=

100;

double min=

fx(ans,y)

;ans-

=0.0005

;double stand=

fx(ans,y)

;while

(stand

方法4:模擬退火演算法

在對於複雜函式進行求解時,以上三種方法,只能求得區域性最優的解。利用模擬退火演算法才可以得到全域性最優解。

具體原理很複雜還不太理解,**實現如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//srand,rand,rand_max

#include

//time

using

namespace std;

typedef

long

long ll;

int num,mark,m,n,t,maxlen,start,end;

#define sc(n) scanf("%d",&n)

doublefx(

double x,

double y)

double

randouble()

intmain()

else}}

} t=t*delta;

ans=

min(ans,

fx(x,y));

}printf

("%.4f\n"

,ans)

;}

python 梯度法求解函式極值的例項

如下所示 coding utf 8 a 0.001 定義收斂步長 xd 1 定義尋找步長 x 0 定義乙個種子x0 i 0 迴圈迭代次數 y 0dic import math def f x y math.sin x 定義函式f x sinx return y def fd x y math.cos...

求解會議安排問題 C 實現

陳老師是乙個比賽隊的主教練,有一天,他想給團隊成員開會,應該為這次會 議安排教室,但教室缺乏,所以教室管理員必須通過接受訂單和拒絕訂單優化教室的利用率。如果接受乙個訂單,則該訂單 的開始時間和結束時間成為乙個活動。注意,每個時間段只 能安排乙個訂單。請找出乙個最大化的總活動時間的方法。你的任務是這樣...

C 實現揹包問題的求解

假設有乙個能裝入總體積為t的揹包和n件體積分別為w1,w2,的物品,能否從 件物品中挑選若干件恰好裝滿揹包,即使 要求找出所有滿足上述條件的解。例如 當 各件物品的體積 時,可找到下列 組解 可利用回溯法的設計思想來解決揹包問題。首先將物品排成一列,然後順序選取物品裝入揹包,假設已選取了前i件物品之...