㈠ 用黃金分割法求f(x)=(x-3)²的最優解 附C語言程序
黃金分割法其實也是Fibonacci法吧!!!因為對於Fibonacci數列,有f(n)/f(n-1)-→0.618......
這題解法我是參考http://hi..com/shyyooeren/blog/item/d74f42104e8ef9f9c2ce7902.html,
只是改了多項式和Fibonacci數列用黃金分割數來求而已(需要改的還有x的范圍(a,b))!
#include<stdio.h>
#include
<math.h>
const
int
fi[10]={1,1,2,3,5,8,13,21,34,55};
double
f(double
x)
//多項式
{
return
(x-3)*(x-3);
}
double
F(int
tn)//計算Fibonacci數
{
if(tn<10)
return
fi[tn];
return
pow(1.618,tn-9)*fi[9];
}
void
main(void)
{
double
r,u,a,b,fr,fu,q;
int
k,n;
//步驟1,初始化
a=0.0;
b=3.0;
k=0;
q=0.00001;
n=0;
while(F(n)<((b-a)/q))n++;
//計算次數n
r=a+(F(n-k-1)/F(n-k+1))*(b-a);
u=a+(F(n-k)/F(n-k+1))*(b-a);
fr=f(r);
fu=f(u);
while(k<n)
{
if(fr>fu)
{
if(b-r<=q)
{
printf("%d:%f",k,u);
break;
}
else
{
a=r;
b=b;
r=u;
fr=fu;
u=a+(F(n-k)/F(n-k+1))*(b-a);
fu=f(u);
k++;
}
}
else
{
if(u-a<=q)
{
printf("%d:%f",k,r);
break;
}
else
{
a=a;
b=u;
u=r;
fu=fr;
r=a+(F(n-k-1)/F(n-k+1))*(b-a);
fr=f(r);
k++;
}
}
}
getchar();
}
㈡ C語言 用黃金分割法求函數的最小值和取最小值時的x
給,已經編譯運行確認: #include"math.h" #include"stdio.h" #definef(x)x*x+2*x+1//一元函數,這里按照你的要求寫的是:x2+2x+1 //函數功能是用黃金分割法實現求一元函數的最優解 doublehj(double*a,double*b,doublee,int*n) {doublex1,x2,s;<br>if(fabs(*b-*a)<=e)<br>s=f((*b+*a)/2);<br>else<br>{x1=*a+0.382*(*b-*a);<br>x2=*a+0.618*(*b-*a);<br>if(f(x1)>f(x2))<br>*a=x1;<br>else<br>*b=x2;<br>*n=*n+1;<br>s=hj(a,b,e,n);<br>} returns; } main() {doubles,a,b,e;<br>intn=0;<br>scanf("%lf%lf%lf",&a,&b,&e);//輸入區間[a,b]和精度e的值<br>s=hj(&a,&b,e,&n);//調用hj函數,其中n代表迭代次數<br>printf("a=%lf,b=%lf,s=%lf,n=%d ",a,b,s,n);<br>} 運行時: 輸入:0.60.50.1 輸出結果為: 0.60.50.1 a=0.600000,b=0.500000,s=2.402500,n=0
㈢ 用C語言編寫黃金分割法f(x)=x2+2x程序
#include#includefloat getequation(float x)
{
return x*x-2*x+2;
}
void main()
{
float a=0;
float b=6;
float result = 0;
do {
float c=a+0.618*(b-a);
float d=a+b-c;
if(fabs(getequation(c)) < fabs(getequation(d)))
{
a=d;
result = c;
}
else
{
b=c;
result = d;
}
} while(fabs(getequation(result)) > 0.01);
printf("f(a)=a*a-7*a+10
");
printf("a=%f
",result);
}
(3)用c語言編寫黃金分割法擴展閱讀
C語言編寫程序求最大值
#include<stdio.h>
doubleMax(double*p,intn)
{
doublemax=*p;
for(inti=0;i<n;i++)
if(*(p+i)>max)
max=*(p+i);
returnmax;
}
doubleMin(double*p,intn)
{
doublemin=*p;
for(inti=0;i<n;i++)
if(*(p+i)<min)
min=*(p+i);
returnmin;
}
doubleAverage(double*p,intn)
{
doublesum=0;
for(inti=0;i<n;i++)
sum+=*(p+i);
returnsum/n;
}
intmain()
{
doublea[10];
printf("請輸入10個實數:
");
for(inti=0;i<10;i++)
scanf("%f",&a[i]);
printf("這10個數中最大值為:%f
",Max(a,10));
printf("這10個數中最小值為:%f ",Min(a,10));
printf("這10個數的平均值為:%f
",Average(a,10));
return0;
㈣ C語言求兩個點的黃金分割;C語言計算題(2,3兩題)
#include <stdio.h>
int main()
{
float x1,y1,x2,y2;
scanf("%f%f%f%f",&x1,&y1,&x2,&y2);
printf("%f %f",(x1+x2)*0.618,(y1+y2)*0.618);
return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
double x=sqrt(1+1.0/(1*2)+1.0/(1*2*3));
double y=pow(asin(1),x);
double z=log(pow(x,2)+y)/(pow(sin(x*y),2)+1);
printf("%lf ",z);
return 0;
}
㈤ 用黃金分割法求f(x)=(x-3)的最優解 附C語言程序
黃金分割法其實也是Fibonacci法吧!!!因為對於Fibonacci數列,有f(n)/f(n-1)-→0.618...... 這題解法我是參考http://hi..com/shyyooeren/blog/item/d74f42104e8ef9f9c2ce7902.html, 只是改了多項式和Fibonacci數列用黃金分割數來求而已(需要改的還有x的范圍(a,b))! #include<stdio.h> #include <math.h> const int fi[10]={1,1,2,3,5,8,13,21,34,55}; double f(double x) //多項式 { return (x-3)*(x-3); } double F(int tn)//計算Fibonacci數 { if(tn<10) return fi[tn]; return pow(1.618,tn-9)*fi[9]; } void main(void) { double r,u,a,b,fr,fu,q; int k,n; //步驟1,初始化 a=0.0; b=3.0; k=0; q=0.00001; n=0; while(F(n)<((b-a)/q))n++; //計算次數n r=a+(F(n-k-1)/F(n-k+1))*(b-a); u=a+(F(n-k)/F(n-k+1))*(b-a); fr=f(r); fu=f(u); while(k<n) { if(fr>fu) { if(b-r<=q) { printf("%d:%f",k,u); break; } else { a=r; b=b; r=u; fr=fu; u=a+(F(n-k)/F(n-k+1))*(b-a); fu=f(u); k++; } } else { if(u-a<=q) { printf("%d:%f",k,r); break; } else { a=a; b=u; u=r; fu=fr; r=a+(F(n-k-1)/F(n-k+1))*(b-a); fr=f(r); k++; } } } getchar(); }
㈥ C語言編程,用黃金分割法求f(a)=a*a-7*a+10的最優解。設初始值a0=0,初始步長h=1,取迭代精度=0.35。急…
#include <stdio.h>
#include <math.h>
float GetEquation(float x)
{
return x*x-7*x+10;
}
void main()
{
float a=0;
float b=6;
float result = 0;
do {
float c=a+0.618*(b-a);
float d=a+b-c;
if(fabs(GetEquation(c)) < fabs(GetEquation(d)))
{
a=d;
result = c;
}
else
{
b=c;
result = d;
}
} while(fabs(GetEquation(result)) > 0.01);
printf("f(a)=a*a-7*a+10\n");
printf("a=%f\n",result);
}
㈦ 用c語言編寫黃金分割法
黃金分割點是指把一條線段分割為兩部分,使其中一部分與全長之比等於另一部分與這部分之比。其比值是一個無理數,用分數表示為(√5-1)/2。黃金分割點(p)的求法,如圖:①過點B作BD⊥AB,使BD=1/2AB;②連結AD,以D為圓心,CB為半徑作弧,交AD於E,...
㈧ c語言編程:用黃金分割法求 minf(x)=x2+2x+1 急!!!!
給,已經編譯運行確認:
#include "math.h"
#include "stdio.h"
#define f(x) x*x+2*x+1 //一元函數,這里按照你的要求寫的是:x2+2x+1
//函數功能是用黃金分割法實現求一元函數 的最優解
double hj(double *a,double *b,double e,int *n)
{ double x1,x2,s;
if(fabs(*b-*a)<=e)
s=f((*b+*a)/2);
else
{ x1=*a+0.382*(*b-*a);
x2=*a+0.618*(*b-*a);
if(f(x1)>f(x2))
*a=x1;
else
*b=x2;
*n=*n+1;
s=hj(a,b,e,n);
}
return s;
}
main()
{ double s,a,b,e;
int n=0;
scanf("%lf %lf %lf",&a,&b,&e); // 輸入區間[a,b]和精度e的值
s=hj(&a,&b,e,&n); //調用hj函數,其中n代表迭代次數
printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n);
}
運行時:
輸入:0.6 0.5 0.1
輸出結果為:
0.6 0.5 0.1
a=0.600000,b=0.500000,s=2.402500,n=0
㈨ 用c程序寫出黃金分割法縮短探索區間求最小值解法
#include<iostream.h>
#include<math.h>
/*黃金分割法求最小值的C++程序,部分變數及函數書寫並不規范*/
//δ為題給精度
int n = (lnδ/ln0.618 + 1) + 1;
int i;
float f(float ai, float bi)
{
a(i + 1) = ai + 0.618(bi - ai);
return ai + 1;
}
float g(float ai, float bi)
{
b(i + 1) = ai + 0.382(bi - ai);
return b(i + 1);
}
float F(float ai, float bi)
{
//題給的f(x)函數式;
return ;
}
float A(float ai, float bi)
{
int i = 1;
float result;
L: do
{
a(i + 1) = f(float ai, float bi);
b(i + 1) = g(float ai, float bi);
float F1 = F(float ai, float bi);
float F2 = F(float a(i + 1), float b(i + 1));
ai = ai, bi = b(i + 1);
i ++;
}while(i <= n && F1 >= F2)
if(i < n)
{
B(float ai, float bi);
}
else
result = F2;
return result;
}
float B(float ai, float bi)
{
do
{
a(i + 1) = f(float ai, float bi);
b(i + 1) = g(float ai, float bi);
float F1 = F(float ai, float bi);
float F2 = F(float a(i + 1), float b(i + 1));
ai = a(i + 1), bi = bi;
i ++;
}while(i <= n && F1 <= F2)
if(i < n)
{
goto L;
}
else
result = F1;
return result;
}
void main()
{
int i = 1;
float A(float ai, float bi);
cout<<"最小值為:"<<result<<endl;
}
㈩ 用C語言編寫黃金分割法f(x)=x2+2x程序
你要很精確的解嗎?如果不要的話那就很簡單了。
x=-3:0.00001:6;中的精度你自己選,太小了會比較慢
y=x.^2+2*x;
[n
m]=min(y);
這個返回的就是x和對應的最小值;