C++算法

C++算法
在这里插入图片描述
在这里插入图片描述

1.用MEX接口

这种方法是最常见的方法,相对来说也比较简单,主要涉及修改C++中入口函数和传递参数格式。

首先在matlab中输入

mex -setup

在这里插入图片描述

用matlab 调用C++
运行结果

连分式主代码

//连分式求积法.cpp
#include
#include
using namespace std;
//计算函数连分式值
double funpqv(double x[], double b[], int n, double t)
{
int k;
double u;
u = b[n];
for (k = n - 1; k >= 0; k–)
{
if (fabs(u) + 1.0 == 1.0)
u = 1.0e1 + 35 * (t - x[k]) / fabs(t - x[k]);
else
u = b[k] + (t - x[k]) / u;
}
return(u);

}
//计算连分式新的一节b[j]

void funpaj(double x[], double y[], double b[], int j)
{
int k,flag = 0;
double u;
u = y[j];
for (k = 0; (k < j) && (flag == 0); k++)
{
if ((u - b[k]) + 1.0 == 1.0)flag = 1;
else
u = (x[j] - x[k]) / (u - b[k]);
}
if (flag == 1) u = 1e1 + 35;
b[j] = u;
return;

}
double pqinteg(double a0, double b0, double eps, double (f) (double))
{
int k, j, il, flag, n;
double
h, * g, * b, h0, g0, d, s0, s1, x;
b = new double[10];
h = new double[10];
g = new double[10];
il = 0; n = 1; h0 = (b0 - a0) / n; flag = 0;
g0 = h0 * ((*f) (a0) + (*f)(b0)) / 2.0;
while ((il < 20 && (flag == 0)))
{
il = il + 1;
h[0] = h0; g[0] = g0; b[0] = g[0];
j = 1; s1 = g[0];
while (j <= 7)
{
d = 0.0;
for (k = 0; k <= n - 1; k++)
{
x = a0 + (k + 0.5) * h[j - 1];
d = d + (*f)(x);

		}
		g[j] = (g[j - 1] + h[j - 1] * d) / 2.0;
		h[j] = h[j - 1] / 2.0;
		n = 2 * n;
		funpaj(h, g, b, j);
		s0 = s1;
		s1 = funpqv(h, b, j, 0.0);
		if (fabs(s1 - s0) >= eps)j = j + 1;
		else
		{
			cout << "最后一次迭代连分式节数=" << j << endl;
			j = 10;
		}
	}

	h0 = h[j - 1]; g0 = g[j - 1];
	if (j == 10) flag = 1;
}
cout << "迭代次数=" << il << endl;
delete[] b; delete[] h; delete[] g;
return(s1);

}

#include"mex.h"

//例
#include
#include
#include “连分式求积分.cpp”
using namespace std;
int main()
{
double d, eps, pqintegf(double);
eps = 0.0000001;
d = pqinteg(0.0, 4.3, eps, pqintegf);
cout << “积分值s=” << d << endl;
return 0;

}
double pqintegf(double x)
{
return(exp(-x * x));
}

高斯求积分

调用

#include
#include
using namespace std;
void part(double a, double b, int m,int n, double fa[], double fb[], double s[2])
{
int mm, k, j;
double sa[4], sb[4], ca[4], cb[4], sma, smb, cma, cmb;
sma - sin(m * a); smb = sin(m * b);
cma = cos(m * a); cmb = cos(m * b);
sa[0] = sma; sa[1] = cma; sa[2] = -sma; sa[3] = -cma;
sb[0] = smb; sb[1] = cmb; sb[2] = -smb; sb[3] = -cmb;
ca[0] = cma; ca[1] = -sma; ca[2] = -cma; ca[3] = sma;
cb[0] = cmb; cb[1] = -smb; cb[2] = -cmb; cb[3] = smb;
s[0] = 0.0; s[1] = 0.0;
mm = 1;
for (k = 0; k <= n - 1; k++)
{
j = k;
while (>= 4)j = j - 4;
mm = mm * m;
s[0] = s[0] + (fb[k] * sb[j] - fa[k] * sa[j]) / (1.0 * mm);
s[1] = s[1] + (fb[k] * cb[j] - fa[k] * ca[j]) / (1.0 * mm);
}
s[1]–s[1];
return.

}

#include"mex.h"

include

#include
#include"高振荡函数求积法.cpp"
using namespace std;
int main()
{
int n, m;
double a, b;
double s[2], fa[4] = { 0.0,1.0,0.0,-3.0 };
double fb[4] = { 6.2831852,1.0,-6.2831852,-3.0 };
a = 0.0; b = 6.2831852;
m = 30; n = 4;
part(a, b, m, n, fa, fb, s);
cout << “s(0)=” << s[0] << endl;
cout << “s(1)=” << s[1] << endl;
return 0;

}

结果
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter Zhangcc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值