有OTDR测试数据,现在需要把数据转成SOR格式文件 。如何用C语言生成SOR格式文件?
你看看这个工具对你有用否
https://blog.csdn.net/qq_28207461/article/details/109112016
你好,可以点击图片链接查看相关代码,希望可以采纳:
符合Bellcore 标准的OTDR文件,直接修改为SOR文件名。不符合的就需要软件转换才可以。
望采纳谢谢,现在才发现这个问题我还可以给你讲解的,跟上一个回答者的还是有些不一样的,希望能帮到你哦
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define N 100
void cre_sch int n,float *w,float a[N][N],float b[N],float lw[N][N],float fw[N] int i,j,k; float tmp1[N][N],tmp2[N][N],rev[N][N],tmp; for i 0;i n;i++ for j 0;j n;j++ if j i tmp1[i][j] a[i][j]; tmp2[i][j] 1-w a[i][j]; rev[i][j] 1; else if j i tmp1[i][j] wa[i][j]; tmp2[i][j] 0; rev[i][j] 0; else tmp1[i][j] 0; tmp2[i][j] -wa[i][j]; rev[i][j] 0; for j 0;j n;j++ for i 0;i n;i++ for k 0;k j;k++ if i j continue; if i j rev[i][k] 1/tmp1[j][j]; continue; rev[i][k]+ rev[j][k] -tmp1[i][j] ; for i 0;i n;i++ for j 0;j n;j++ tmp 0.0; for k 0;k n;k++ tmp+ rev[i][k]*tmp2[k][j]; lw[i][j] tmp; for i 0;i n;i++ tmp 0.0; for k 0;k n;k++ tmp+ wrev[i][k]*b[k]; fw[i] tmp; void Table int n,float a[N][N],float b[N],float *w int i,j;
float lw[N][N],fw[N];
printf "Please input the matrix A by row!\n" ; /请输入矩阵的行/ for i 0;i n;i++ printf "Row %d:",i+1 ;
for j 0;j n;j++ scanf "%f",&a[i][j] ; printf "Please input the vector b:" ; /请输入向量b/
for i 0;i n;i++ scanf "%f",&b[i] ; printf "Input w:" ; scanf "%f",w ; cre_sch n,w,a,b,lw,fw ; printf "\nThe matrix A and vector b:\n" ; /矩阵A和向量b/
for i 0;i n;i++ for j 0;j n;j++ printf "%10.5f",a[i][j] ; printf "%10.5f",b[i] ; printf "\n" ; printf "\nThe SOR iterative scheme matrix Lw & vector fw :\n" ;/*SOR迭代 矩阵lw和向量fw */ for i 0;i n;i++ for j 0;j n;j++ printf "%10.5f",lw[i][j] ; printf "%10.5f",fw[i] ; printf "\n" ; void init_vec int n,float x[N] int i; printf "\nPlease input the initial iteration vector x:" ; /请输入初始迭代向量x/ for i 0;i n;i++ scanf "%f",&x[i] ; printf "\nThe initial iteration vector x:\n" ; /初始迭代向量x/ for i 0;i n;i++ printf "%10.5f",x[i] ; printf "\n" ; void sor int n,float a[N][N],float b[N],float x[N],float w int i,j,k; float p; /精确度/ float tmp1,tmp2,x2[N];
printf "输入精确值:\n" ; scanf "%f",&p ; for k 0;;k++ for i 0;i n;i++ x2[i] x[i]; for i 0;i n;i++ tmp1 0.0; tmp2 0.0; for j 0;j i;j++ tmp1+ a[i][j]*x[j];
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 5
#define w 1
#define epsilon 0.0000001
void main()
{
double normD(double x0[N], double x1[N]);
void SORiteration1(double A[N][N], double b[N], double x0[N], double x1[N]);
void SORiteration2(double A[N][N], double b[N], double x0[N], double x1[N]);
void triangularEquationsSolver(double T[N][N], double b[N], double x[N]);
int i, j;
static double A[N][N] = { { 5, 1, 1, 1, 1 }, { 1, 5, 1, 1, 1 }, { 1, 1, 5, 1, 1 }, { 1, 1, 1, 5, 1 }, { 1, 1, 1, 1, 5 } };
double b[N] = { 1.0, 1.0, 1.0, 1.0, 1.0 };
double x0[N] = { 1.0, 1.0, 1.0, 1.0, 1.0 };
double x00[N] = { 1.0, 1.0, 1.0, 1.0, 1.0 };
double xHf[N] = { 0 };
double x1[N];
do
{
memcpy(x0, x1, N*sizeof(double));
SORiteration1(A, b, x0, xHf);
SORiteration2(A, b, xHf, x1);
} while (normD(x0, x1) > epsilon);
printf("\n要求解的示例方程组为:\n A ||| b ||| x0\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%f ", A[i][j]);
}
printf("||| %f||| %f\n", b[i], x00[i]);
}
printf("\n方程组解为:\n");
for (i = 0; i < N; i++)
{
printf("%f\n", x0[i]);
}
getchar();
}
double normD(double x0[N], double x1[N])
{
int i;
double s = 0;
for (i = 0; i < N; i++)
{
s = s + (x0[i] - x1[i])*(x0[i] - x1[i]);
}
return sqrt(s);
}
void SORiteration1(double A[N][N], double b[N], double x0[N], double x1[N])//传数组往往是传其地址
{
void triangularEquationsSolver(double T[N][N], double b[N], double x[N]);
//浪费一点内存没事,程序更具可读性。
double Lwl[N][N] = { 0 };
double Uwr[N][N] = { 0 };
//double bb[N];
int i, j;
double wb[N];
for (i = 1; i < N; i++)
{
for (j = 0; j < i; j++)
{
Lwl[i][j] = w*A[i][j];
Uwr[j][i] = -w*A[j][i];
}
}
for (i = 0; i < N; i++)
{
Lwl[i][i] = A[i][i];
Uwr[i][i] = (1 - w)*A[i][i];
wb[i] = w*b[i];
}
for (i = 0; i < N; i++)
{
for (j = i; j < N; j++)
{
wb[i] = wb[i] + Uwr[i][j] * x0[j];
}
}
triangularEquationsSolver(Lwl, wb, x1);
//printf("X1:\n");
//for (i = 0; i < N; i++)
//{
// printf("%f", x1[i]);
//}
//getchar();
}
void SORiteration2(double A[N][N], double b[N], double x0[N], double x1[N])
{
void triangularEquationsSolver(double T[N][N], double b[N], double x[N]);
//浪费一点内存没事,程序更具可读性。
double Uwl[N][N] = { 0 };
double Lwr[N][N] = { 0 };
int i, j;
double wb[N];
for (i = 1; i < N; i++)
{
for (j = 0; j < i; j++)
{
Uwl[j][i] = w*A[j][i];
Lwr[i][j] = -w*A[i][j];
}
}
for (i = 0; i < N; i++)
{
Uwl[i][i] = A[i][i];
Lwr[i][i] = (1 - w)*A[i][i];
wb[i] = w*b[i];
for (j = 0; j < i; j++)
{
wb[i] = wb[i] + Lwr[i][j] * x0[j];
}
}
triangularEquationsSolver(Uwl, wb, x1);
}
//求解上下三角方程的求解器
void triangularEquationsSolver(double T[N][N], double b[N], double x[N])
{
int i, j;
//for (i = 0; i < N; i++)
//{
// for (j = 0; j < N; j++)
// {
// printf("%f ", T[i][j]);
// }
// printf("\n");
//}
//getchar();
if (T[0][N - 1] == 0)
{
for (i = 0; i < N; i++)
{
for (j = 0; j < i; j++)
{
b[i] = b[i] - T[i][j] * x[j];
}
x[i] = b[i] / T[i][i];
}
}
else
{
for (i = N - 1; i >= 0; i--)
{
for (j = i + 1; j < N; j++)
{
b[i] = b[i] - T[i][j] * x[j];
}
x[i] = b[i] / T[i][i];
}
}
}