week1-模拟和高精度

前言

这是博客是为了巩固知识点,而写的题解,本蒟蒻第一次写题解,如果写的不好,请各位大佬谅解(。・_・。)

1.乒乓球:

国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。
其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。
华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。
在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。 
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分): 
WWWWWWWWWWWWWWWWWWWWWWLW 
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。
而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。
如果一局比赛刚开始,则此时比分为0比0。 
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入格式:
每个输入文件包含若干行字符串(每行至多20个字母),字符串由大写的W、L和E组成。
其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出格式:
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。
其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
输入样例:
WWWWWWWWWWWWWWWWWWWW
WWLWE
输出样例:
11:0
11:0
1:1
21:0
2:1

思路如下:

先用数组来存储这些字符,1代表W,-1代表L,0代表E,然后遍历该数组,根据规则输出结果即可
注意:乒乓球比赛只有当分差大等于2分时才会结束,例如:11:10时,21:20时,比赛是不会结束的!( ˚ཫ˚ )

完整代码如下:

#include<bits/stdc++.h>
using namespace std;    
int len=0;
int win=0;   //胜利的次数
int lose=0;   //失败的次数
char str[55555];   //比赛的情况
void game(int n){   //n表示是11分制,还是21分制
	lose=0;
	win=0;
	for(int i=0;i<len;i++){
		if(str[i]=='W'){
			win++;
		}
		else if(str[i]=='L'){
			lose++;
		}
		if(str[i]=='E'){   
		//如果比赛结束,跳出循环,直接输出现在的比分
			break;
		}
		if(win>=n||lose>=n){
			if(abs(win-lose)>=2){ 
				cout<<win<<":"<<lose<<endl;
				win=0;
				lose=0;   //输出完成后要归零
			}
		}
	}
	cout<<win<<":"<<lose;   //如果比赛刚刚开始或者还没有比完,或者结束了
	return ;
}
int main(){
	char a;
	while(cin>>a){
		if(a=='W'||a=='L'){
			str[len]=a;		
			len++;
		}
		else if(a=='E'){
			str[len]=a;
			break;
			}		
		}	  //输入比赛情况
	game(11);   //11分制
	cout<<endl<<endl;  //注意,在11分制和21分制之间要有两个两个换行
	game(21);	  //21分制
return 0;
} 

2.高精度加法:

对于输入的两个不超过100位数字的非负整数,给出两数之和。
输入格式:
在两行中分别给出两个不超过100位数字的非负整数
输出格式:
在一行中输出两数之和
输入样例:
123
12
输出样例:
135

本题需要高精度加法的知识,具体什么是高精度加法呢?就是将需要相加的两个数的每个位置上的数字取出来,存放到一个数组里面,例如135,变成1 3 5;然后根据小学就学过的加法进行相加,并输出结果就行了,是不是很简单•⌄•.

完整代码如下:

#include<bits/stdc++.h>
using namespace std;    
string a1,b1;  //需要输入的两个数,必须用字符或者字符串形式存储(数据太大了,整形放不下)
int anum=0;   
int bnum=0;   //
int len=0;  
int len1,len2;    //两个数的位数
int sumnum[110]={0};
int a_num[105]={0};   //数字a的各个位置上的数字
int b_num[105]={0};   //数字b的各个位置上的数字
char a[105],b[105];   //将字符串的各个字符存放到字符数组里,方便将字符转化为数字
void turn(int x1,int x2){   //将字符串的各个字符存放到字符数组里
	for(int i=0;i<x1;i++){
		a[i]=a1[i];
	}
	for(int i=0;i<x2;i++){
		b[i]=b1[i];
	}	
}
int main(){
    cin>>a1>>b1;
    len1=a1.length();  
    len2=b1.length();  //求出两个数的位数
    turn(len1,len2);  //将字符串的各个字符存放到字符数组里
    for(int i=len1-1;i>=0;i--){  
    	a_num[anum++]=a[i]-'0';
	}
    for(int i=len2-1;i>=0;i--){
    	b_num[bnum++]=b[i]-'0';   //将字符转化为数字,减去'0'即可,这里是倒序存的,方便之后的相加
	}
	int len=max(anum,bnum);   //去两个数较大位数的位数
	for(int i=0;i<len;i++){
		sumnum[i]+=(a_num[i]+b_num[i]);   //相同位数的数字相加
		sumnum[i+1]+=((a_num[i]+b_num[i])/10);  //进位
		sumnum[i]%=10;  //要对10取余
		if(sumnum[len]>0){
			len++;   //如果最高位之后有进位,说明位数需要加长
		}
	}
	for(int j=len-1;j>=0;j--){
		cout<<sumnum[j];  //倒序输出最后结果
	}
    return 0;
}

3.高精度求累加和

使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
55

此题显然不能累加,需要用到累加的公式:(a1(1)+an(n))n/2,那么这就需要高精度的乘法和除法了那么什么是高精度的乘法呢?回想一下刚才的高精度加法,再回想一下小学学的乘法你就能知道,乘法在运算时需要加法,那么就可以根据加法写出乘法;那怎么解决除法呢?除法其实就是另一种乘法,比如除以2其实就是乘以0.5,所以就可以写出答案.๐•ᴗ•๐

完整代码如下:

#include<iostream>
using namespace std;
char a[250];    //存放输入的数字各个位上的数字
string b;   //用字符串存放输入的数字
int b_num[250]={0};  //初始化数组
void turnstr(int len){   //将字符串的字符存放到字符数组里
    for(int i=0;i<len;i++){
        a[i]=b[i];
    }
    return ;
}
void turnnum(int len){   //将字符数组的字符变为数字
    for(int i=0;i<len;i++){
        b_num[i]=a[i]-'0';
    }
    return ;
}
int main(){
    int start,x;  
    int b2[250]={0};   //用于存放最终的结果
    cin>>b;   //输入数字
    int len1=b.length();   //获取数字的长度
    turnstr(len1);  //转化为字符数组
    turnnum(len1);  //转化为数组
    int b1_num[250];  
    for(int i=0;i<250;i++){
    	b1_num[i]=b_num[i];
	}
    b1_num[len1-1]+=1;   //获取b+1的结果
//高精度乘法:
    for(int i=len1-1;i>=0;i--){
        start=len1-i-1;  //每次加的起点都要变化,都要往前移一位
        for(int j=len1-1;j>=0;j--){
            b2[start]+=b_num[i]*b1_num[j];  //获取该位置上相加后的结果
            start++;   //位置每次都要向前移一位
            x=start;  //获取最后的数组长度
        }
    }
    for(int i=0;i<x;i++){
        b2[i+1]+=b2[i]/10;  //开始进位
        b2[i]%=10;
        if(b2[x]>0){
            x++;  //如果最高位大于0,说明数组长度需要扩大
        }
    }
//高精度除法(其实就是乘以0.5):
    for(int i=0;i<x;i++){
        b2[i]*=5;  //每个位置都乘以5
    }
    for(int i=0;i<x;i++){   //开始进位
        b2[i+1]+=b2[i]/10;
        b2[i]%=10;
        if(b2[x]>0){
            x++;
        }
    }
    for(int i=x-1;i>=1;i--){   //最后结尾只能为1,不能是0,因为乘以0.5,小数点需要向后移一位
        cout<<b2[i];
    }
    return 0;
}

完美结束₍˄·͈༝·͈˄₎◞ ̑̑ෆ⃛

阶段一:原型开发Week 1-4) 流体动力学建模(Day1-3) 1. 三维建模准备 软件环境: SOLIDWORKS 2024(教育版) Flow Simulation插件(高级流体分析模块) 基础模型参数: 水轮类型:佩尔顿冲击式 叶轮直径:18mm 叶片数量:24片(双排交错布局) 喷嘴直径:1.2mm DiffCopyInsert 2. 边界条件设定 // 压力边界矩阵 pressure_range = linspace(0.2,0.6,5); // MPa单 flow_velocity = [2.1, 2.8, 3.5, 4.2, 5.0]; // m/s对应流速 // 材料属性 water_density = 998.2 kg/m³ @25℃ dynamic_viscosity = 0.001002 Pa·s DiffCopyInsert 3. 倾角迭代测试协议 # 自动化参数扫描脚本 for angle in range(15,26): adjust_blade_angle(angle) # SOLIDWORKS API控制 run_simulation('Transient', 5000 iterations) record_data( output_power = torque * rpm * 0.1047, # 功率计算式 efficiency = (output_power / (0.5 * density * A * v³)) * 100 ) DiffCopyInsert 4. 关键分析指标 | 参数 | 计算公式 | 目标阈值 | |------|---------|---------| | 涡流损耗 | ∫(ω²)dV | <0.3W | | 压力恢复系数 | (P_out - P_in)/0.5ρv² | >0.65 | | 临界空化数 | (P - P_vapor)/(0.5ρv²) | >2.5 | 5. 硬件验证准备 3D打印验证件: 材料:Formlabs Rigid 10K Resin 精度:50μm层厚 后处理:乙醇超声清洗+UV二次固化 测试台搭建: // 数据采集系统 pressure_sensor: BMP388 (0-1MPa量程) flow_sensor: YF-S201霍尔效应式 torque_meter: 微型应变片式(量程0-5mN·m) DiffCopyInsert 实验数据对比(Day4) CFD与实测数据对比表 | 转速(rpm) | 模拟值 | 实测值 | 误差率 | |----------|--------|--------|--------| | 1500 | 1523 | 1487 | 2.42% | | 3200 | 3255 | 3084 | 5.25% | 修正措施: 添加表面粗糙度参数(Ra=3.2μm) 修正湍流模型:k-ω SST替代标准k-ε模型 增加边界层网格(5层,增长率1.2) 设计冻结标准 能量转换效率 ≥18% 启动水流速度 ≤0.45m/s 轴向载荷 ≤0.8N(确保电机寿命) 成本控制措施 电机改造:采用WD40解密后的硬盘电机(东芝MQ04ABF系列) 3D打印策略:中空结构(壁厚0.6mm)+蜂窝状填充(密度12%) 电路板自制:采用JLCPCB SMT贴片服务(50片成本≈¥120) 交付物清单 仿真报告(PDF,含收敛曲线图) 参数化模型(SLDPRT+SLDDRW) 实验数据集(CSV格式) 设计验证计划(Excel跟踪表) 通过该实施方案,团队可在72小时内完成三轮设计迭代,确保涡轮模块在0.3MPa工况下实现至少15%的水能-电能转换效率,为后续集成测试奠定基础。建议使用Git进行版本控制,每次迭代生成tag标记(如v0.1-alpha)。 Chat 基于此想法,给出更详细的实施步骤
最新发布
03-09
<think>好的,用户的问题是关于使用SOLIDWORKS 2024Flow Simulation插件对佩尔顿冲击式水轮进行流体动力学建模及原型开发的详细步骤。我需要先理解用户的具体需求,然后逐步分解问题,提供清晰的实施步骤相关建议。 首先,用户提到的内容涉及三维建模、边界条件设定、倾角迭代测试、关键指标评估、硬件验证准备,还有自动化脚本、数据对比、修正措施成本控制。这些方面都需要详细展开,每个步骤可能需要分点说明,确保用户能够按步骤操作。 接下来,我需要回忆SOLIDWORKS Flow Simulation的基本操作流程。例如,三维建模部分需要创建水轮机的叶片、喷嘴、转轮等部件,并确保几何精度。边界条件的设定可能包括入口流速、出口压力、旋转参数等。倾角迭代测试可能需要参数扫描,这里用户提到了自动化脚本,可能需要使用Flow Simulation的API或宏功能来实现参数自动调整结果记录。 然后,关键分析指标如效率、压力分布、扭矩输出,这些需要明确如何通过CFD模拟获取,并与实际测量数据对比。数据对比方法可能包括误差计算、图表生成等。修正措施可能涉及几何优化或材料调整,成本控制则需要考虑模拟次数、材料选择等因素。 还需要注意用户提到的引用内容,特别是引用3中关于中文字符路径的问题,需提醒用户确保文件路径为英文,避免插件出错。同时,引用1中提到的Flow Simulation的功能,可以强调其在模拟中的优势,如参数化研究结果可视化。 可能用户在实际操作中会遇到哪些问题?比如网格划分的细节、收敛性问题,或者脚本编写的困难。虽然用户没有直接提问这些,但在步骤中可以适当加入注意事项或常见问题解决方法,如调整网格精度、监控求解器收敛情况等。 最后,生成的相关问题需要围绕用户主题展开,例如性能优化方法、与其他软件的对比、成本控制案例等,帮助用户进一步深入学习。 现在需要将以上思考整理成结构化的回答,分步骤详细说明,确保每个环节都覆盖用户的需求,并引用提供的资料中的相关信息,特别是文件路径问题Flow Simulation的集成优势。同时,语言要简明,避免过于技术化,让用户容易理解。</think>以下是使用SOLIDWORKS 2024及其Flow Simulation插件对佩尔顿冲击式水轮机进行流体动力学建模与原型开发的系统化实施步骤: ### 一、三维建模阶段 1. **基础建模** - 使用$r=\sqrt{x^2+y^2}$极坐标公式构建水斗曲面,通过**曲面放样**功能生成渐开线型水斗几何体 - 采用**参数化设计**关联喷嘴直径$D$与水斗开度$h$的比例关系:$$h = 1.2D + \frac{D^2}{150}$$ [^2] 2. **装配体优化** - 转轮与喷嘴的配合间隙控制在$0.05-0.1mm$范围 - 设置**质量属性检查**确保转动惯量$I=\frac{1}{2}mr^2$满足设计要求 ### 二、Flow Simulation设置 1. **边界条件** | 参数类型 | 设定值 | 公式依据 | |----------------|--------------------------|-----------------------| | 入口压力 | 3-6MPa动态范围 | 伯努利方程$P+\frac{1}{2}\rho v^2=C$ | | 出口背压 | 标准大气压101.325kPa | ISO标准 | | 旋转参考系 | 角速度$\omega=2\pi n/60$ | 转轮动力学方程 | 2. **网格划分策略** - 边界层设置3层加密网格,首层厚度$y^+<5$满足湍流模型要求 - 全局网格尺寸按$D/50$控制,重点区域局部加密至$D/200$ ### 三、自动化参数扫描 ```vbscript ' Flow Simulation API示例 Sub ParameterSweep() Dim swApp As Object Set swApp = Application.SldWorks For theta = 15 To 30 Step 5 ' 倾角迭代范围 swApp.ActiveDoc.Parameter("D1@Sketch1").Value = theta swApp.RunMacro "C:\Macros\RunAnalysis.swp" ResultsExport "Data_" & CStr(theta) Next theta End Sub ``` *注:需配合SOLIDWORKS宏录制功能实现自动参数迭代[^3]* ### 四、关键指标评估 1. **CFD-实测对比方法** - 建立误差矩阵:$$E_{ij} = \frac{|X_{sim}-X_{exp}|}{X_{exp}} \times 100\%$$ - 采用**动态时间规整(DTW)**算法对齐非同步采集数据 2. **修正措施优先级** ```mermaid graph TD A[效率偏差>5%] --> B[检查边界层分离] A --> C[优化水斗曲面曲率] C --> D[重新计算质量流量平衡] ``` ### 五、硬件验证准备 1. **3D打印验证模型** - 选择光敏树脂材料时考虑$E=2.1GPa$弹性模量与$\nu=0.33$泊松比 - 保留0.2%尺寸补偿量应对材料收缩 2. **成本控制策略** - 采用田口方法设计$L_9(3^4)$正交试验减少模拟次数 - 优先优化对效率影响最大的前3个参数(参见灵敏度分析结果) ### 六、数据对比报告 建议构建如下对比表格: | 工况点 | 理论效率(%) | CFD结果(%) | 实测值(%) | 偏差Δ | |--------|-------------|------------|-----------|-------| | 额定 | 89.2 | 87.5 | 86.8 | 0.7 | | 超载 | 82.1 | 79.4 | 78.9 | 0.5 | *注:所有数据存储路径必须使用全英文目录*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值