仅用于本人复习 侵删
牛顿法求近似解
#include <stdio.h>
#include <math.h>
#define EPSILON 1e-6
double f(double x) {
return 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;
}
double f_prime(double x) {
return 6 * pow(x, 2) - 8 * x + 3;
}
double h(double x)
{
return pow(x,3)-4*pow(x,2)+3*x-6;
}
double h_prime(double x)
{
return 3*pow(x,2)-8*x+3;
}
double newton(double (*fp)(double),double (*fp_prime)(double)) {
double x = 1.5;
while (fabs(fp(x)) > EPSILON){
x = x - fp(x) / fp_prime(x);
}
return x;
}
int main() {
printf("%g\n", newton(f,f_prime));
printf("%g\n", newton(h,h_prime));
return 0;
}
二分法求方程近似解
这里题目给定解x的范围在[-20,20]内
#include <stdio.h>
#include <math.h>
#define EPSILON 1e-7
double bisection(int p, int q, double (*func)(int, int, double));
double f(int p, int q, double x);
int main() {
int p;
int q;
scanf("%d%d", &p, &q);
printf("%.4f\n", bisection(p, q, f));
return 0;
}
double bisection(int p, int q, double (*func)(int, int, double)) {
double left=-20,right=20;
double mid=(left+right)/2.0;
while(fabs(f(p,q,mid))>=EPSILON && fabs(left-right)>=EPSILON)
{
if(f(p,q,mid)*f(p,q,left)<=0)
right=mid;
else
left=mid;
mid=(left+right)/2.0;
}
return mid;
}
double f(int p, int q, double x) {
return p * x + q;
}
求解关于x的方程x+ln(x)=a的解,其中a为常数
输入格式
输入包含一行一个浮点数啊(-10<=a<=10^4),且最多只有4小数
输出格式
输出一行一个浮点数表示解,答案误差在10^-4之内都能被接受
样例输入1
10
样例输出1
7.929420
样例输入2
0.5
样例输出2
0.766248
#include <stdio.h>
#include <math.h>
double fun(double a,double x)
{
if(fabs(a-log(x)-x)<=1e-4)
{
return x;
}
else
{
double diff=x+log(x)-a;
double ff=1.0/x+1.0;
return fun(a,x-diff/ff);
}
}
int main()
{
double a;
scanf("%lf",&a);
double i;
if(a<0)
{
i=0.2;
}
else if(a-0<=1e-4)
{
i=0.3;
}
else if(fabs(a)<1)
{
i=0.567;
}
else
{
i=a*1.0;
}
printf("%lf",fun(a,i));
return 0;
}